demo.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. # -*- coding: utf-8 -*-
  2. # @Author: wangkun
  3. # @Time: 2022/8/3
  4. import json
  5. import os
  6. import time
  7. import urllib.parse
  8. from urllib import parse
  9. import requests
  10. import urllib3
  11. from main.feishu_lib import Feishu
  12. class Demo:
  13. a = {'status': 'COMPLETE', 'method': 'POST', 'protocolVersion': 'HTTP/2.0', 'scheme': 'https',
  14. 'host': 'mp.weixin.qq.com', 'actualPort': 443, 'path': '/mp/getappmsgext',
  15. 'query': 'f=json&mock=&uin=777&key=777&pass_ticket=4WDX7FDZxYmt%2Bx77QKq%2B5qz%2Bvux5bG9cpHC3j0EcxIvKhciCknuhYxJ66oEfat7Q&wxtoken=&devicetype=iOS14.7.1&clientversion=18001a29&__biz=Mzg5MDY2NzY5Nw%3D%3D&appmsg_token=1177_DfjvTIKXLHqugpzdn8BmPsqgwxY5-FNHUUKpoxSZutwmjBLx7jw2iS9optAan7wDQmua-fOawTcritQQ&x5=0&f=json',
  16. 'tunnel': False, 'keptAlive': True, 'webSocket': False, 'remoteAddress': 'mp.weixin.qq.com/116.128.164.66',
  17. 'clientAddress': '/192.168.80.75', 'clientPort': 58309,
  18. 'times': {'start': '2022-08-03T16:04:08.245+08:00', 'requestBegin': '2022-08-03T16:04:08.273+08:00',
  19. 'requestComplete': '2022-08-03T16:04:08.273+08:00', 'responseBegin': '2022-08-03T16:04:08.570+08:00',
  20. 'end': '2022-08-03T16:04:08.570+08:00'},
  21. 'durations': {'total': 297, 'dns': None, 'connect': None, 'ssl': None, 'request': 0, 'response': 0,
  22. 'latency': 297}, 'speeds': {'overall': 12383, 'request': 0, 'response': 0}, 'totalSize': 3678,
  23. 'ssl': {'protocol': 'TLSv1.2', 'cipherSuite': 'TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256'},
  24. 'alpn': {'protocol': 'h2'},
  25. 'request': {'sizes': {'headers': 333, 'body': 1214},
  26. 'mimeType': 'application/x-www-form-urlencoded',
  27. 'charset': 'UTF-8',
  28. 'contentEncoding': None,
  29. 'header': {
  30. 'headers': [{'name': ':method', 'value': 'POST'}, {'name': ':scheme', 'value': 'https'},
  31. {'name': ':path',
  32. 'value': '/mp/getappmsgext?f=json&mock=&uin=777&key=777&pass_ticket=4WDX7FDZxYmt%2Bx77QKq%2B5qz%2Bvux5bG9cpHC3j0EcxIvKhciCknuhYxJ66oEfat7Q&wxtoken=&devicetype=iOS14.7.1&clientversion=18001a29&__biz=Mzg5MDY2NzY5Nw%3D%3D&appmsg_token=1177_DfjvTIKXLHqugpzdn8BmPsqgwxY5-FNHUUKpoxSZutwmjBLx7jw2iS9optAan7wDQmua-fOawTcritQQ&x5=0&f=json'},
  33. {'name': ':authority', 'value': 'mp.weixin.qq.com'},
  34. {'name': 'content-type',
  35. 'value': 'application/x-www-form-urlencoded; charset=UTF-8'},
  36. {'name': 'accept', 'value': '*/*'},
  37. {'name': 'x-requested-with', 'value': 'XMLHttpRequest'},
  38. {'name': 'accept-language', 'value': 'zh-cn'},
  39. {'name': 'accept-encoding', 'value': 'gzip, deflate, br'},
  40. {'name': 'origin', 'value': 'https://mp.weixin.qq.com'},
  41. {'name': 'user-agent',
  42. 'value': 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.26(0x18001a29) NetType/WIFI Language/zh_CN'},
  43. {'name': 'referer',
  44. 'value': 'https://mp.weixin.qq.com/s?__biz=Mzg5MDY2NzY5Nw==&mid=2247484729&idx=2&sn=e54e57d3555a534bcfdb7a86034a3ccd&chksm=cfd852e7f8afdbf1349d1ba0216371a6a42c9454f234da2242b5a474ced7fbd0f05e45d1a22e&sessionid=1659513710&channel_session_id=&scene=136&subscene=&exptype=&reloadid=1659509075&reloadseq=13&related_video_source=10&ascene=1&devicetype=iOS14.7.1&version=18001a29&nettype=WIFI&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&session_us=gh_7364edd0ca9f&fontScale=100&exportkey=ARbT3%2BQ31iSfbn80Q%2F%2BhLjE%3D&pass_ticket=4WDX7FDZxYmt%2Bx77QKq%2B5qz%2Bvux5bG9cpHC3j0EcxIvKhciCknuhYxJ66oEfat7Q&wx_header=3'},
  45. {'name': 'content-length', 'value': '1214'},
  46. {'name': 'cookie',
  47. 'value': 'appmsg_token=1177_DfjvTIKXLHqugpzdn8BmPsqgwxY5-FNHUUKpoxSZutwmjBLx7jw2iS9optAan7wDQmua-fOawTcritQQ'},
  48. {'name': 'cookie', 'value': 'devicetype=iOS14.7.1'},
  49. {'name': 'cookie', 'value': 'lang=zh_CN'},
  50. {'name': 'cookie',
  51. 'value': 'pass_ticket=4WDX7FDZxYmt+x77QKq+5qz+vux5bG9cpHC3j0EcxIvKhciCknuhYxJ66oEfat7Q'},
  52. {'name': 'cookie', 'value': 'rewardsn='},
  53. {'name': 'cookie', 'value': 'version=18001a29'},
  54. {'name': 'cookie',
  55. 'value': 'wap_sid2=CNSn5r4HEooBeV9ITlN2SWl2eW9raHo3MUtVODBhTS1qSl9oV2lZUUowaGdVdDRIWnVULWhrM3Z2bno2RnNPenNXWHFMeUZRYkVqVm9LNEZWYzkxU0xpNlJWVkx0alhSM3BGcExNSWU0WlZxc1hKcTI5X0pQbW5CMG44RklaZng4Y1VSd0NtU0huaDRIWVNBQUF+MPjXqJcGOA1AAQ=='},
  56. {'name': 'cookie', 'value': 'wxtokenkey=777'},
  57. {'name': 'cookie', 'value': 'wxuin=2010747860'}]},
  58. 'body': {
  59. 'text': 'r=0.9724616618215032&__biz=Mzg5MDY2NzY5Nw%3D%3D&appmsg_type=9&mid=2247484729&sn=e54e57d3555a534bcfdb7a86034a3ccd&idx=2&scene=136&title=%25E6%259B%25B9%25E8%258A%2599%25E5%2598%2589%25E5%258A%25A8%25E6%2583%2585%25E6%25BC%2594%25E5%2594%25B1%25E3%2580%258A%25E4%25BD%25A0%25E7%259A%2584%25E7%259C%25BC%25E7%25A5%259E%25E3%2580%258B%25EF%25BC%258C%25E6%25AD%258C%25E8%25AF%258D%25E6%2584%258F%25E5%25A2%2583%25E7%25BE%258E%25EF%25BC%258C%25E6%25AD%258C%25E5%25A3%25B0%25E6%259B%25B4%25E5%25A9%2589%25E8%25BD%25AC%25EF%25BC%2581%25EF%25BC%2581&ct=1655094616&abtest_cookie=AAACAA%3D%3D&devicetype=iOS14.7.1&version=18001a29&is_need_ticket=0&is_need_ad=1&comment_id=0&is_need_reward=0&both_ad=0&reward_uin_count=0&send_time=&msg_daily_idx=1&is_original=0&is_only_read=1&req_id=0316p4k91JVhhqI4GRIX6RM9&pass_ticket=4WDX7FDZxYmt%2Bx77QKq%2B5qz%2Bvux5bG9cpHC3j0EcxIvKhciCknuhYxJ66oEfat7Q&is_temp_url=0&item_show_type=5&tmp_version=1&more_read_type=0&appmsg_like_type=2&related_video_sn=&related_video_num=5&vid=wxv_2440907288103370752&is_pay_subscribe=0&pay_subscribe_uin_count=0&has_red_packet_cover=0&album_id=1296223588617486300&album_video_num=5&cur_album_id=&is_public_related_video=0&encode_info_by_base64=0&exptype=',
  60. 'charset': 'UTF-8'}},
  61. 'response': {'status': 200, 'sizes': {'headers': 36, 'body': 2095}, 'mimeType': 'application/json',
  62. 'charset': 'UTF-8', 'contentEncoding': 'gzip', 'header': {
  63. 'headers': [{'name': ':status', 'value': '200'},
  64. {'name': 'content-type', 'value': 'application/json; charset=UTF-8'},
  65. {'name': 'cache-control', 'value': 'no-cache, must-revalidate'},
  66. {'name': 'retkey', 'value': '14'}, {'name': 'logicret', 'value': '0'},
  67. {'name': 'strict-transport-security', 'value': 'max-age=0'},
  68. {'name': 'set-cookie', 'value': 'wxtokenkey=777; Path=/; HttpOnly'},
  69. {'name': 'mmlas-verifyresult', 'value': 'CAEoAA=='},
  70. {'name': 'content-encoding', 'value': 'gzip'}]}, 'body': {'encoding': 'base64',
  71. 'encoded': 'eyJhZHZlcnRpc2VtZW50X2luZm8iOltdLCJhcHBtc2dzdGF0Ijp7InNob3ciOnRydWUsImlzX2xvZ2luIjp0cnVlLCJsaWtlZCI6ZmFsc2UsInJlYWRfbnVtIjozNiwibGlrZV9udW0iOjEsInJldCI6MCwicmVhbF9yZWFkX251bSI6MCwidmVyc2lvbiI6MSwicHJvbXB0ZWQiOjEsImxpa2VfZGlzYWJsZWQiOmZhbHNlLCJzdHlsZSI6MiwidmlkZW9fcHYiOjc5LCJ2aWRlb191diI6MzYsImZyaWVuZF9saWtlX251bSI6MCwib2xkX2xpa2VkIjpmYWxzZSwib2xkX2xpa2VfbnVtIjoyLCJzaG93X2dyYXkiOjAsIm9sZF9saWtlZF9iZWZvcmUiOjAsInNob3dfbGlrZSI6MSwic2hvd19saWtlX2dyYXkiOjAsInNob3dfb2xkX2xpa2UiOjEsInNob3dfb2xkX2xpa2VfZ3JheSI6MCwic2hvd19yZWFkIjoxfSwicmV3YXJkX2hlYWRfaW1ncyI6W10sImlzX2ZhbnMiOjEsImJhc2VfcmVzcCI6eyJ3eHRva2VuIjo3Nzd9LCJtb3JlX3JlYWRfbGlzdCI6W10sImZyaWVuZF9zdWJzY3JpYmVfY291bnQiOjAsIm9yaWdpbmFsX2FydGljbGVfY291bnQiOjAsInJlbGF0ZWRfdGFnX3ZpZGVvIjpbeyJ1cmwiOiJodHRwczpcL1wvbXAud2VpeGluLnFxLmNvbVwvcz9fX2Jpej1Nemc1TURZMk56WTVOdz09Jm1pZD0yMjQ3NDg0NzEwJmlkeD0xJnNuPTY1N2EzNDFkYTQyZWQwNzFhYWE0ZDNjZTg1M2Y2NGYyJmNoa3NtPWNmZDg1MmY4ZjhhZmRiZWVmNTEzMzQwZGVjODcwMjQzM2JkNzgxMzdlN2I0YWZiNjY1ZDFkZTUwMTRkYzY4MzdlZDRkY2M5Nzk2ODQmc2NlbmU9MTMyI3JkIiwidGl0bGUiOiLlvZPpnbPkuJzpgYfkuIrmr5vpmL/mlY/vvIzlm73lrrbpmJ/lpKfkvazlvIDlj6PmnpznhLbkuI3lkIzlh6Hlk43vvIzlpKrlpb3lkKzkuoblkKfvvIEiLCJkaWdlc3QiOiIiLCJjb3ZlciI6Imh0dHBzOlwvXC9tbWJpei5xcGljLmNuXC9tbWJpel9qcGdcL1FHbjZGRmliRVVlalhzNVJsaWNRejV3alZyUzFTY1pxT3Boc2pJbWZzT3Y1MHBYUFZyd0Z0TE5pY010NzlEM1VXYnZBSEdqVm5xYmFDMzlxaWFVYXpyaWFWRXdcLzY0MCIsInB1YlRpbWUiOjE2NTQ4MjQ3MTAsImR1cmF0aW9uIjo0NDgsInZpZCI6Ind4dl8yNDM2NTg5MTA2ODYxNDU3NDA4IiwidmlkZW9XaWR0aCI6ODY0LCJ2aWRlb0hlaWdodCI6NDg2LCJzcmNVc2VyTmFtZSI6ImdoXzczNjRlZGQwY2E5ZiIsInNyY0Rpc3BsYXlOYW1lIjoi5Zac5YS/6KeG6aKRIiwibGlrZV9udW0iOjAsInJlYWRfbnVtIjoxMTMsInVzZXJfcmVhZF9zdGF0dXMiOjIsInJlY19pbmZvIjoiIiwiaGVhZF9pbWdfdXJsIjoiaHR0cDpcL1wvd3gucWxvZ28uY25cL21taGVhZFwvUTNhdUhnend6TTZ1azZHSzQ2ME1iN0J1aWIzUWtwbU1oclRiZTZaUjBSMk1GNWhOZTFHSXh5UVwvMCIsImN1dF9jb3ZlciI6IiJ9LHsidXJsIjoiaHR0cHM6XC9cL21wLndlaXhpbi5xcS5jb21cL3M/X19iaXo9TXpnNU1EWTJOelk1Tnc9PSZtaWQ9MjI0NzQ4NDczNSZpZHg9NCZzbj05ZjMxNTNiNWMxZjBmOTA0NjQyNDY4NGI0MTU4ZmQ0ZiZjaGtzbT1jZmQ4NTJlMWY4YWZkYmY3N2MxM2RjZWIxYjAwZmZiMzdkMTBiMjZmMDA1NWM2OThiZjAxYjI0NjY5NjRjYjlmNDljZWQ5YzdhYmRkJnNjZW5lPTEzMiNyZCIsInRpdGxlIjoi8J+mi+aXqeS4iuWlve+8geS5jOWFsOWbvumbheS4gOmmluOAiuaEn+aBqeeahOW/g+OAi+aDhea3seaEj+a1k++8jOmAgee7meaIkeeahOWlveaci+WPi++8jOaEn+aBqemBh+ingSIsImRpZ2VzdCI6IiIsImNvdmVyIjoiaHR0cHM6XC9cL21tYml6LnFwaWMuY25cL21tYml6X2pwZ1wvUUduNkZGaWJFVWVpYThHNlp3aWM4M0lhZ2FUcmE1Nk9nWWxWWDZIQ1FrelVOdkRNNzdCNk1kZ05lQVd3SDhNNzlWczJPaWFNMVZUdnc0SkVpYnpKUWpCSndxQVwvNjQwIiwicHViVGltZSI6MTY1NTE2ODU4OCwiZHVyYXRpb24iOjIwOCwidmlkIjoid3h2XzI0NDIzNTA1MzczMzg3OTgwODIiLCJ2aWRlb1dpZHRoIjo4NzIsInZpZGVvSGVpZ2h0Ijo0ODAsInNyY1VzZXJOYW1lIjoiZ2hfNzM2NGVkZDBjYTlmIiwic3JjRGlzcGxheU5hbWUiOiLllpzlhL/op4bpopEiLCJsaWtlX251bSI6MCwicmVhZF9udW0iOjQ5LCJ1c2VyX3JlYWRfc3RhdHVzIjoyLCJyZWNfaW5mbyI6IiIsImhlYWRfaW1nX3VybCI6Imh0dHA6XC9cL3d4LnFsb2dvLmNuXC9tbWhlYWRcL1EzYXVIZ3p3ek02dWs2R0s0NjBNYjdCdWliM1FrcG1NaHJUYmU2WlIwUjJNRjVoTmUxR0l4eVFcLzAiLCJjdXRfY292ZXIiOiIifSx7InVybCI6Imh0dHBzOlwvXC9tcC53ZWl4aW4ucXEuY29tXC9zP19fYml6PU16ZzVNRFkyTnpZNU53PT0mbWlkPTIyNDc0ODQ3MjkmaWR4PTEmc249MGYwZGRjMDk1ZDI1YmE5ZDUxNzhlOWQ1NzU4MzM0MzcmY2hrc209Y2ZkODUyZTdmOGFmZGJmMWNjMjVhNmE3ODBhZTVkNmI4NjdlYmU3YzI4NTAzNjY3YTQyYTM0ZTQ3M2Y1MzlkN2FhMzE1NjU4YTUyMSZzY2VuZT0xMzIjcmQiLCJ0aXRsZSI6IuadjueOieWImueOsOWcuua8lOWUseOAiumbqOiKseefs+OAi+WlveWQrOaegeS6hu+8jOWPr+S7peWQrOS4gOS4iyIsImRpZ2VzdCI6IiIsImNvdmVyIjoiaHR0cHM6XC9cL21tYml6LnFwaWMuY25cL21tYml6X2pwZ1wvUUduNkZGaWJFVWVnMDNpY2h0dlBuSUFlNzYyR3kxZ2FoZjM3MzJHbFBsZGo5NlRkMjdCc0dHdGFQODV0aWE5bDJYcnR5MHNSMkJiTGpSOGljUE1CaHdvUFVBXC82NDAiLCJwdWJUaW1lIjoxNjU1MDk0NjEwLCJkdXJhdGlvbiI6MTMyLCJ2aWQiOiJ3eHZfMjQ0MDkwOTIzMTY3NjczNTQ4OCIsInZpZGVvV2lkdGgiOjg0NCwidmlkZW9IZWlnaHQiOjQ4Niwic3JjVXNlck5hbWUiOiJnaF83MzY0ZWRkMGNhOWYiLCJzcmNEaXNwbGF5TmFtZSI6IuWWnOWEv+inhumikSIsImxpa2VfbnVtIjowLCJyZWFkX251bSI6NjYsInVzZXJfcmVhZF9zdGF0dXMiOjIsInJlY19pbmZvIjoiIiwiaGVhZF9pbWdfdXJsIjoiaHR0cDpcL1wvd3gucWxvZ28uY25cL21taGVhZFwvUTNhdUhnend6TTZ1azZHSzQ2ME1iN0J1aWIzUWtwbU1oclRiZTZaUjBSMk1GNWhOZTFHSXh5UVwvMCIsImN1dF9jb3ZlciI6IiJ9LHsidXJsIjoiaHR0cHM6XC9cL21wLndlaXhpbi5xcS5jb21cL3M/X19iaXo9TXpnNU1EWTJOelk1Tnc9PSZtaWQ9MjI0NzQ4NDcyOSZpZHg9MyZzbj1hZDVhN2ZkZmM5NDk5YmExMDZlNDdhM2EzZGJiMjc0NiZjaGtzbT1jZmQ4NTJlN2Y4YWZkYmYxMTAxODRlOTdiNmI4MGI4MGU3YzZjNDdjNzVmOTM0YmQ0YTM4NjZkMWNiMzJiNzExMGYyZmY0ZTcxZjUwJnNjZW5lPTEzMiNyZCIsInRpdGxlIjoi5p2O546J5Yia5rex5oOF5ryU5ZSx44CK5Yia5aW96YGH6KeB5L2g44CL77yM5ZeT6Z+z5aSq5aW95ZCs77yM5ZSx5Ye65b+D5Yqo55qE5oSf6KeJIiwiZGlnZXN0IjoiIiwiY292ZXIiOiJodHRwczpcL1wvbW1iaXoucXBpYy5jblwvbW1iaXpfanBnXC9RR242RkZpYkVVZWcwM2ljaHR2UG5JQWU3NjJHeTFnYWhmekZWakt4dUtYTm5RdjNMUFJMZnZab1pXY3BvV0ZhMkZYRWp4YkpRYlM1R1NKWWljRXppYU9GcUFcLzY0MCIsInB1YlRpbWUiOjE2NTUwOTQ2MTAsImR1cmF0aW9uIjoxMzUsInZpZCI6Ind4dl8yNDQwOTA2MzA2MDY1ODA5NDA5IiwidmlkZW9XaWR0aCI6ODY0LCJ2aWRlb0hlaWdodCI6NDg2LCJzcmNVc2VyTmFtZSI6ImdoXzczNjRlZGQwY2E5ZiIsInNyY0Rpc3BsYXlOYW1lIjoi5Zac5YS/6KeG6aKRIiwibGlrZV9udW0iOjAsInJlYWRfbnVtIjoyOCwidXNlcl9yZWFkX3N0YXR1cyI6MiwicmVjX2luZm8iOiIiLCJoZWFkX2ltZ191cmwiOiJodHRwOlwvXC93eC5xbG9nby5jblwvbW1oZWFkXC9RM2F1SGd6d3pNNnVrNkdLNDYwTWI3QnVpYjNRa3BtTWhyVGJlNlpSMFIyTUY1aE5lMUdJeHlRXC8wIiwiY3V0X2NvdmVyIjoiIn0seyJ1cmwiOiJodHRwczpcL1wvbXAud2VpeGluLnFxLmNvbVwvcz9fX2Jpej1Nemc1TURZMk56WTVOdz09Jm1pZD0yMjQ3NDg0NzI5JmlkeD00JnNuPTliZDhiMDlkMzIzNjIxOWNlNTEwMDFiYjI1YmQ5YWFlJmNoa3NtPWNmZDg1MmU3ZjhhZmRiZjE3OGVlMTIxZTQzNTI1OGQ3Mzg4ODY4OGYzZTRiMjliODU3YjM1OTA5ZGZiZDU2Y2UxOWMzMThiMDM4NGUmc2NlbmU9MTMyI3JkIiwidGl0bGUiOiLmnY7njrLnjonnv7vllLHjgIrlpbPlhL/mg4XjgIvvvIzmiJHop4nlvpfmmK/lpbPnlJ/niYjph4zmnIDlpb3lkKznmoTvvIEiLCJkaWdlc3QiOiIiLCJjb3ZlciI6Imh0dHBzOlwvXC9tbWJpei5xcGljLmNuXC9tbWJpel9qcGdcL1FHbjZGRmliRVVlZzAzaWNodHZQbklBZTc2Mkd5MWdhaGZvVFBORjBjeFVlRlhhQ2cxRDhQODQ2WUdzYUZsZGJpYnA4cHBDMklRWUgyQ2JrZUxlRXhaZjhnXC82NDAiLCJwdWJUaW1lIjoxNjU1MDk0NjEwLCJkdXJhdGlvbiI6ODksInZpZCI6Ind4dl8yNDQwOTA1ODM1NjY2MjI3MjA0IiwidmlkZW9XaWR0aCI6ODcyLCJ2aWRlb0hlaWdodCI6NDgwLCJzcmNVc2VyTmFtZSI6ImdoXzczNjRlZGQwY2E5ZiIsInNyY0Rpc3BsYXlOYW1lIjoi5Zac5YS/6KeG6aKRIiwibGlrZV9udW0iOjAsInJlYWRfbnVtIjo0MywidXNlcl9yZWFkX3N0YXR1cyI6MiwicmVjX2luZm8iOiIiLCJoZWFkX2ltZ191cmwiOiJodHRwOlwvXC93eC5xbG9nby5jblwvbW1oZWFkXC9RM2F1SGd6d3pNNnVrNkdLNDYwTWI3QnVpYjNRa3BtTWhyVGJlNlpSMFIyTUY1aE5lMUdJeHlRXC8wIiwiY3V0X2NvdmVyIjoiIn1dLCJ2aWRlb19yZWNvbW1lbmRfdHlwZSI6MiwidmlkZW9fZXh0cmFfY291bnQiOjUsImFwcG1zZ19hbGJ1bV92aWRlb3MiOltdLCJ0ZXN0X2ZsYWciOjgsInZpZGVvX3NlcSI6IiIsInZpZGVvX2NvbnRpbnVlX2ZsYWciOjEsInB1YmxpY190YWdfaW5mbyI6eyJ0YWdzIjpbXX0sInNoYXJlX2ZsYWciOnsic2hvdyI6MSwic2hvd19ncmF5IjowfSwicmVxdWVzdF9pZCI6Ijc5NDgzNjI1MzEwODAzNDY2NDgiLCJhcHBtc2dhY3QiOnsib2xkX2xpa2VkX2JlZm9yZSI6MCwic2Vlbl9iZWZvcmUiOjAsInNoYXJlX2JlZm9yZSI6MCwiZmF2b3JpdGVfYmVmb3JlIjowLCJyZXdhcmRfYmVmb3JlIjowLCJwYXlfYmVmb3JlIjowfSwibW9yZV92aWRlb19zb3J0X2lkIjowLCJyZWxhdGVkX3ZpZGVvX2luZm8iOnsicHVzaF9jaGFubmVsX3NlcSI6IiJ9LCJmYXZvcml0ZV9mbGFnIjp7InNob3ciOjEsInNob3dfZ3JheSI6MH0sInNob3dfcmVsYXRlZF9hcnRpY2xlIjowLCJzaG93X2Jpel9iYW5uZXIiOjF9',
  72. 'decoded': True}}}
  73. requests = [{'name': ':method', 'value': 'POST'},
  74. {'name': ':authority', 'value': 'mp.weixin.qq.com'},
  75. {'name': ':scheme', 'value': 'https'},
  76. {'name': ':path', 'value': '/mp/getappmsgext?f=json&mock=&uin=MTg1MjQ0OTk4&key=f3ab133c95f120b3d26f1a624df7a26eb5765bdb887fcd9c281331f81947b12b9fa2e3a551e9832ce902bab581c4cd1a87ed329d7b7301b2783118732c51a0e425da2f08d6ad0e4aa1cfdeae4b9928d3947dcc0a602fcbbc5ef3ccf9375fa8c64ce0f7b50854519496b82c73eb80b2c9d552ea52dabb59e5c92e685a46ff18ee&pass_ticket=xbeyqQ1ksq8SEh3xkndNPK5q8LZoftmGRx24wRoBpST9OP6uyMvD%2BjpasAZedbPv&wxtoken=&devicetype=Windows%26nbsp%3B10%26nbsp%3Bx64&clientversion=6307001e&__biz=MzkwMjM4OTYyMA%3D%3D&appmsg_token=1177_Xfy7QVzJYbleb8vYMyo-YRARfwlB7d5uI1fr6POTsEOzIvg5Cy9F7xyfluA~&x5=0&f=json'},
  77. {'name': 'content-length', 'value': '1222'},
  78. {'name': 'origin', 'value': 'https://mp.weixin.qq.com'},
  79. {'name': 'x-requested-with', 'value': 'XMLHttpRequest'},
  80. {'name': 'user-agent', 'value': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x6307001e)'},
  81. {'name': 'content-type', 'value': 'application/x-www-form-urlencoded; charset=UTF-8'},
  82. {'name': 'accept', 'value': '*/*'}, {'name': 'cookie', 'value': 'rewardsn='},
  83. {'name': 'cookie', 'value': 'wxtokenkey=777'},
  84. {'name': 'cookie', 'value': 'wxuin=185244998'},
  85. {'name': 'cookie', 'value': 'devicetype=Windows10x64'}, {'name': 'cookie', 'value': 'version=6307001e'},
  86. {'name': 'cookie', 'value': 'lang=zh_CN'},
  87. {'name': 'cookie', 'value': 'pass_ticket=xbeyqQ1ksq8SEh3xkndNPK5q8LZoftmGRx24wRoBpST9OP6uyMvD+jpasAZedbPv'},
  88. {'name': 'cookie', 'value': 'appmsg_token=1177_Xfy7QVzJYbleb8vYMyo-YRARfwlB7d5uI1fr6POTsEOzIvg5Cy9F7xyfluA~'},
  89. {'name': 'cookie', 'value': 'wap_sid2=CMa6qlgSigF5X0hQVDNYbm9KejFaSlR3dm51N01SeVJ4OTJrTkxmTDVCZU9IMmRXOFk3OVIxQ2F6eWhGVGpWTTJ4TERZTVFrUFdfd01GTWhMcTBIT1lXb2dLNkxNRHM1WWo0M3R0M2tpa21xNzM2bGNrMVpLNUR3b0d6dFlSWmh6Vld4dmxIQnhGNlhjU0FBQX4w04HDlwY4DUAB'},
  90. {'name': 'sec-fetch-site', 'value': 'same-origin'}, {'name': 'sec-fetch-mode', 'value': 'cors'},
  91. {'name': 'sec-fetch-dest', 'value': 'empty'},
  92. {'name': 'referer', 'value': 'https://mp.weixin.qq.com/s?__biz=MzkwMjM4OTYyMA==&mid=2247483675&idx=1&sn=56393c8ee332ab511ff17a60bd7f408e&chksm=c0a70b00f7d08216613c42d0134e60e1482b98f36dfc9bc0ce1cf5a5e0915d07d595d78e9680&scene=126&sessionid=1659944150&key=f3ab133c95f120b3d26f1a624df7a26eb5765bdb887fcd9c281331f81947b12b9fa2e3a551e9832ce902bab581c4cd1a87ed329d7b7301b2783118732c51a0e425da2f08d6ad0e4aa1cfdeae4b9928d3947dcc0a602fcbbc5ef3ccf9375fa8c64ce0f7b50854519496b82c73eb80b2c9d552ea52dabb59e5c92e685a46ff18ee&ascene=15&uin=MTg1MjQ0OTk4&devicetype=Windows+10+x64&version=6307001e&lang=zh_CN&session_us=gh_db2092f706be&exportkey=AzvzWU%2Fq4joHF%2FHa31cAhic%3D&acctmode=0&pass_ticket=xbeyqQ1ksq8SEh3xkndNPK5q8LZoftmGRx24wRoBpST9OP6uyMvD%2BjpasAZedbPv&wx_header=0&fontgear=2'},
  93. {'name': 'accept-encoding', 'value': 'gzip, deflate, br'},
  94. {'name': 'accept-language', 'value': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7'}]
  95. # 获取 token,保存至飞书云文档
  96. @classmethod
  97. def get_token(cls):
  98. # charles 抓包文件保存目录
  99. charles_file_dir = "../chlsfiles/"
  100. if int(len(os.listdir(charles_file_dir))) == 0:
  101. print("未找到chlsfile文件,等待60s")
  102. time.sleep(60)
  103. else:
  104. # try:
  105. # 目标文件夹下所有文件
  106. all_file = sorted(os.listdir(charles_file_dir))
  107. # 获取到目标文件
  108. old_file = all_file[-1]
  109. # 分离文件名与扩展名
  110. new_file = os.path.splitext(old_file)
  111. # 重命名文件后缀
  112. os.rename(os.path.join(charles_file_dir, old_file),
  113. os.path.join(charles_file_dir, new_file[0] + ".txt"))
  114. with open(charles_file_dir + new_file[0] + ".txt", encoding='utf-8-sig', errors='ignore') as f:
  115. contents = json.load(f, strict=False)
  116. for content in contents:
  117. if "mp.weixin.qq.com" in content['host']:
  118. if content["path"] == r"/mp/getappmsgext":
  119. # query
  120. query = content["query"]
  121. Feishu.update_values("recommend", "gzh", "VzrN7E", "B9:B9", [[query]])
  122. # body
  123. headers = content["request"]["header"]["headers"]
  124. body = content["request"]["body"]["text"]
  125. # time.sleep(1)
  126. Feishu.update_values("recommend", "gzh", "VzrN7E", "B8:B8", [[body]])
  127. # title / vid
  128. title = content["request"]["body"]["text"].split("title=")[-1].split("&ct=")[0]
  129. vid = content["request"]["body"]["text"].split("vid=")[-1].split("&is_pay_subscribe")[0]
  130. # time.sleep(1)
  131. Feishu.update_values("recommend", "gzh", "VzrN7E", "B1:B1", [[title]])
  132. # time.sleep(1)
  133. Feishu.update_values("recommend", "gzh", "VzrN7E", "B2:B2", [[vid]])
  134. for h in headers:
  135. if h["name"] == "cookie" and "pass_ticket" in h["value"]:
  136. pass_ticket = h["value"].split("pass_ticket=")[-1]
  137. # print(f"pass_ticket:{pass_ticket}")
  138. Feishu.update_values("recommend", "gzh", "VzrN7E", "B5:B5", [[pass_ticket]])
  139. if h["name"] == "referer":
  140. referer = h["value"]
  141. # print(f"__biz:{referer}")
  142. Feishu.update_values("recommend", "gzh", "VzrN7E", "B7:B7", [[referer]])
  143. if h["name"] == "referer":
  144. __biz = h["value"].split("__biz=")[-1].split("&mid=")[0]
  145. # print(f"__biz:{__biz}")
  146. Feishu.update_values("recommend", "gzh", "VzrN7E", "B3:B3", [[__biz]])
  147. if h["name"] == "cookie" and "appmsg_token" in h["value"]:
  148. appmsg_token = h["value"].split("appmsg_token=")[-1]
  149. # print(f"appmsg_token:{appmsg_token}")
  150. Feishu.update_values("recommend", "gzh", "VzrN7E", "B4:B4", [[appmsg_token]])
  151. if h["name"] == "cookie" and "wap_sid2" in h["value"]:
  152. wap_sid2 = h["value"].split("wap_sid2=")[-1]
  153. # print(f"wap_sid2:{wap_sid2}")
  154. Feishu.update_values("recommend", "gzh", "VzrN7E", "B6:B6", [[wap_sid2]])
  155. # 获取视频下载链接
  156. @classmethod
  157. def get_url(cls, url):
  158. try:
  159. payload = {}
  160. headers = {
  161. 'Cookie': 'rewardsn=; wxtokenkey=777'
  162. }
  163. urllib3.disable_warnings()
  164. response = requests.get(url=url, headers=headers, data=payload, verify=False)
  165. response_list = response.text.splitlines()
  166. video_url_list = []
  167. for m in response_list:
  168. if "mpvideo.qpic.cn" in m:
  169. video_url = m.split("url: '")[1].split("',")[0].replace(r"\x26amp;", "&")
  170. video_url_list.append(video_url)
  171. video_url = video_url_list[0]
  172. return video_url
  173. except Exception as e:
  174. print(f"get_url异常:{e}")
  175. @classmethod
  176. def recommend(cls):
  177. token_sheet = Feishu.get_values_batch("recommend", "gzh", "VzrN7E")
  178. title = token_sheet[0][1]
  179. vid = token_sheet[1][1]
  180. __biz = token_sheet[2][1]
  181. appmsg_token = token_sheet[3][1]
  182. pass_ticket = token_sheet[4][1]
  183. wap_sid2 = token_sheet[5][1]
  184. referer = token_sheet[6][1]
  185. body = token_sheet[7][1]
  186. query = token_sheet[8][1]
  187. # title = "%25E8%25BF%2599%25E4%25B8%25AA%25E5%25BC%259F%25E6%2591%258A%25E4%25B8%258A%25E8%25BF%2599%25E4%25B8%25AA%25E5%2593%25A5%25E4%25B8%258D%25E7%259F%25A5%25E9%2581%2593%25E6%2598%25AF%25E5%25B9%25B8%25E8%25BF%2590%25E8%25BF%2598%25E6%2598%25AF%25E5%2599%25A9%25E6%25A2%25A6%25E7%259A%2584%25E5%25BC%2580%25E5%25A7%258B"
  188. # vid = "wxv_2512850656278560768"
  189. # __biz = "MzkwMjM4OTYyMA%3D%3D"
  190. # appmsg_token = "1177_uEP3JZFhlaEpfuX2xZkF7a5mr7y0GIw2Xtm6WmawNEjFdmTFLWIMx6XbC5z-mFgwQ6mWBq8Wh9EvcaVI"
  191. # pass_ticket = "1VEraA4AwklrT95KI+7WK09zHoybkPgSDgYX/Fw3ArRKYh+QnkI1NXGFHvZ0naeD"
  192. # wap_sid2 = "CNSn5r4HEooBeV9ISXFxZ1FWX1JPazhCVXlfWW5UU0dSbXpza0lHZnlKSDVUVF9aUndjeDhvbDctc0tfUGlWd09uOTVwcTVxWGVkenB5Nld2YkRKNFBKVk9jZVpJZTZGU2hXUkpnZlB5OTMwSEJXQVpTNS13NnJXY0hiTjJibkJ6U3Z3WllaRkNmcEwzWVNBQUF+MOzurZcGOA1AAQ=="
  193. # print(f"title:{title}")
  194. # print(f"vid:{vid}")
  195. # print(f"__biz:{__biz}")
  196. # print(f"appmsg_token:{appmsg_token}")
  197. # print(f"pass_ticket:{pass_ticket}")
  198. # print(f"wap_sid2:{wap_sid2}\n")
  199. url = "https://mp.weixin.qq.com/mp/getappmsgext?"
  200. headers = {
  201. # "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
  202. "content-type": 'text/plain',
  203. "accept": "*/*",
  204. "x-requested-with": "XMLHttpRequest",
  205. "accept-language": "zh-cn",
  206. "accept-encoding": "gzip, deflate, br",
  207. "origin": "https://mp.weixin.qq.com",
  208. "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 "
  209. "(KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.26(0x18001a29)"
  210. " NetType/WIFI Language/zh_CN",
  211. "referer": referer,
  212. }
  213. # query_string = {
  214. # "f": "json",
  215. # "mock": "",
  216. # "uin": "777",
  217. # "key": "777",
  218. # "pass_ticket": pass_ticket,
  219. # "wxtoken": "",
  220. # "devicetype": "iOS14.7.1",
  221. # "clientversion": "18001a29",
  222. # "__biz": __biz,
  223. # "appmsg_token": appmsg_token,
  224. # "x5": "0",
  225. # # "f": "json"
  226. # }
  227. cookies = {
  228. "appmsg_token": appmsg_token,
  229. "devicetype": "iOS14.7.1",
  230. "lang": "zh_CN",
  231. "pass_ticket": pass_ticket,
  232. "rewardsn": "",
  233. "version": "18001a29",
  234. "wap_sid2": wap_sid2,
  235. "wxtokenkey": "777",
  236. "wxuin": "2010747860"
  237. }
  238. # form = {
  239. # "r": "0.7399955678811934",
  240. # "__biz": __biz,
  241. # "appmsg_type": "9",
  242. # "mid": "2247483669",
  243. # "sn": "b290af5fe2d28a02bf93721a10ce5106",
  244. # "idx": "1",
  245. # "scene": "136",
  246. # "title": title,
  247. # "ct": "1659387788",
  248. # "abtest_cookie": "AAACAA==",
  249. # "devicetype": "iOS14.7.1",
  250. # "version": "18001a29",
  251. # "is_need_ticket": "0",
  252. # "is_need_ad": "1",
  253. # "comment_id": "0",
  254. # "is_need_reward": "0",
  255. # "both_ad": "0",
  256. # "reward_uin_count": "0",
  257. # "send_time": "",
  258. # "msg_daily_idx": "1",
  259. # "is_original": "0",
  260. # "is_only_read": "1",
  261. # "req_id": "0415gcfdToRrDu1wXSkK8VcK",
  262. # "pass_ticket": pass_ticket,
  263. # "is_temp_url": "0",
  264. # "item_show_type": "5",
  265. # "tmp_version": "1",
  266. # "more_read_type": "0",
  267. # "appmsg_like_type": "2",
  268. # "related_video_sn": "",
  269. # "related_video_num": "5",
  270. # "vid": vid,
  271. # "is_pay_subscribe": "0",
  272. # "pay_subscribe_uin_count": "0",
  273. # "has_red_packet_cover": "0",
  274. # "album_id": "1296223588617486300",
  275. # "album_video_num": "5",
  276. # "cur_album_id": "",
  277. # "is_public_related_video": "0",
  278. # "encode_info_by_base64": "0",
  279. # "exptype": ""
  280. # }
  281. response = requests.post(url=url, headers=headers, cookies=cookies, params=query, data=body)
  282. if "related_tag_video" not in response.json():
  283. print(f"response:{response.text}\n")
  284. elif len(response.json()["related_tag_video"]) == 0:
  285. print(f"response:{response.text}\n")
  286. else:
  287. feeds = response.json()["related_tag_video"]
  288. for m in range(len(feeds)):
  289. # video_title
  290. if "title" not in feeds[m]:
  291. video_title = 0
  292. else:
  293. video_title = feeds[m]["title"]
  294. # video_title = base64.b64decode(video_title).decode("utf-8")
  295. # video_id
  296. if "vid" not in feeds[m]:
  297. video_id = 0
  298. else:
  299. video_id = feeds[m]["vid"]
  300. # play_cnt
  301. if "read_num" not in feeds[m]:
  302. play_cnt = 0
  303. else:
  304. play_cnt = feeds[m]["read_num"]
  305. # like_cnt
  306. if "like_num" not in feeds[m]:
  307. like_cnt = 0
  308. else:
  309. like_cnt = feeds[m]["like_num"]
  310. # duration
  311. if "duration" not in feeds[m]:
  312. duration = 0
  313. else:
  314. duration = feeds[m]["duration"]
  315. # video_width / video_height
  316. if "videoWidth" not in feeds[m] or "videoHeight" not in feeds[m]:
  317. video_width = 0
  318. video_height = 0
  319. else:
  320. video_width = feeds[m]["videoWidth"]
  321. video_height = feeds[m]["videoHeight"]
  322. # send_time
  323. if "pubTime" not in feeds[m]:
  324. send_time = 0
  325. else:
  326. send_time = feeds[m]["pubTime"]
  327. # user_name
  328. if "srcDisplayName" not in feeds[m]:
  329. user_name = 0
  330. else:
  331. user_name = feeds[m]["srcDisplayName"]
  332. # user_name = base64.b64decode(user_name).decode("utf-8")
  333. # user_id
  334. if "srcUserName" not in feeds[m]:
  335. user_id = 0
  336. else:
  337. user_id = feeds[m]["srcUserName"]
  338. # head_url
  339. if "head_img_url" not in feeds[m]:
  340. head_url = 0
  341. else:
  342. head_url = feeds[m]["head_img_url"]
  343. # cover_url
  344. if "cover" not in feeds[m]:
  345. cover_url = 0
  346. else:
  347. cover_url = feeds[m]["cover"]
  348. # video_url
  349. if "url" not in feeds[m]:
  350. video_url = 0
  351. else:
  352. video_url = feeds[m]["url"]
  353. # 下载链接
  354. download_url = cls.get_url(video_url)
  355. print(f"video_title:{video_title}")
  356. print(f"download_url:{download_url}")
  357. # print(f"video_id:{video_id}")
  358. # print(f"play_cnt:{play_cnt}")
  359. # print(f"like_cnt:{like_cnt}")
  360. # print(f"duration:{duration}")
  361. # print(f"video_width:{video_width}")
  362. # print(f"video_height:{video_height}")
  363. # print(f"send_time:{send_time}")
  364. # print(f"user_name:{user_name}")
  365. # print(f"user_id:{user_id}")
  366. # print(f"head_url:{head_url}")
  367. # print(f"cover_url:{cover_url}")
  368. # print(f"video_url:{video_url}")
  369. print("\n")
  370. @classmethod
  371. def get_sheet(cls):
  372. sheet = Feishu.get_values_batch("recommend", "gzh", "VzrN7E")
  373. print(sheet)
  374. print(sheet[0][1])
  375. print(sheet[1][1])
  376. print(sheet[2][1])
  377. print(sheet[3][1])
  378. print(sheet[4][1])
  379. print(sheet[5][1])
  380. if __name__ == "__main__":
  381. Demo.get_token()
  382. Demo.recommend()
  383. # Demo.get_sheet()