demo.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  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', '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'},
  32. {'name': ':authority', 'value': 'mp.weixin.qq.com'},
  33. {'name': 'content-type', 'value': 'application/x-www-form-urlencoded; charset=UTF-8'},
  34. {'name': 'accept', 'value': '*/*'},
  35. {'name': 'x-requested-with', 'value': 'XMLHttpRequest'},
  36. {'name': 'accept-language', 'value': 'zh-cn'},
  37. {'name': 'accept-encoding', 'value': 'gzip, deflate, br'},
  38. {'name': 'origin', 'value': 'https://mp.weixin.qq.com'},
  39. {'name': 'user-agent', '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'},
  40. {'name': 'referer', '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'},
  41. {'name': 'content-length', 'value': '1214'},
  42. {'name': 'cookie', 'value': 'appmsg_token=1177_DfjvTIKXLHqugpzdn8BmPsqgwxY5-FNHUUKpoxSZutwmjBLx7jw2iS9optAan7wDQmua-fOawTcritQQ'},
  43. {'name': 'cookie', 'value': 'devicetype=iOS14.7.1'},
  44. {'name': 'cookie', 'value': 'lang=zh_CN'},
  45. {'name': 'cookie', 'value': 'pass_ticket=4WDX7FDZxYmt+x77QKq+5qz+vux5bG9cpHC3j0EcxIvKhciCknuhYxJ66oEfat7Q'},
  46. {'name': 'cookie', 'value': 'rewardsn='},
  47. {'name': 'cookie', 'value': 'version=18001a29'},
  48. {'name': 'cookie', 'value': 'wap_sid2=CNSn5r4HEooBeV9ITlN2SWl2eW9raHo3MUtVODBhTS1qSl9oV2lZUUowaGdVdDRIWnVULWhrM3Z2bno2RnNPenNXWHFMeUZRYkVqVm9LNEZWYzkxU0xpNlJWVkx0alhSM3BGcExNSWU0WlZxc1hKcTI5X0pQbW5CMG44RklaZng4Y1VSd0NtU0huaDRIWVNBQUF+MPjXqJcGOA1AAQ=='},
  49. {'name': 'cookie', 'value': 'wxtokenkey=777'},
  50. {'name': 'cookie', 'value': 'wxuin=2010747860'}]},
  51. 'body': {
  52. '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=',
  53. 'charset': 'UTF-8'}},
  54. 'response': {'status': 200, 'sizes': {'headers': 36, 'body': 2095}, 'mimeType': 'application/json',
  55. 'charset': 'UTF-8', 'contentEncoding': 'gzip', 'header': {
  56. 'headers': [{'name': ':status', 'value': '200'},
  57. {'name': 'content-type', 'value': 'application/json; charset=UTF-8'},
  58. {'name': 'cache-control', 'value': 'no-cache, must-revalidate'},
  59. {'name': 'retkey', 'value': '14'}, {'name': 'logicret', 'value': '0'},
  60. {'name': 'strict-transport-security', 'value': 'max-age=0'},
  61. {'name': 'set-cookie', 'value': 'wxtokenkey=777; Path=/; HttpOnly'},
  62. {'name': 'mmlas-verifyresult', 'value': 'CAEoAA=='},
  63. {'name': 'content-encoding', 'value': 'gzip'}]}, 'body': {'encoding': 'base64',
  64. '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',
  65. 'decoded': True}}}
  66. # 获取 token,保存至飞书云文档
  67. @classmethod
  68. def get_token(cls):
  69. # charles 抓包文件保存目录
  70. charles_file_dir = "../chlsfiles/"
  71. if int(len(os.listdir(charles_file_dir))) == 0:
  72. print("未找到chlsfile文件,等待60s")
  73. time.sleep(60)
  74. else:
  75. # try:
  76. # 目标文件夹下所有文件
  77. all_file = sorted(os.listdir(charles_file_dir))
  78. # 获取到目标文件
  79. old_file = all_file[-1]
  80. # 分离文件名与扩展名
  81. new_file = os.path.splitext(old_file)
  82. # 重命名文件后缀
  83. os.rename(os.path.join(charles_file_dir, old_file),
  84. os.path.join(charles_file_dir, new_file[0] + ".txt"))
  85. with open(charles_file_dir + new_file[0] + ".txt", encoding='utf-8-sig', errors='ignore') as f:
  86. contents = json.load(f, strict=False)
  87. print(f"\nnewfile:{new_file}\n")
  88. # 定义需要返回的列表
  89. request_info = []
  90. for content in contents:
  91. if "mp.weixin.qq.com" in content['host']:
  92. if content["path"] == r"/mp/getappmsgext":
  93. headers = content["request"]["header"]["headers"]
  94. title = content["request"]["body"]["text"].split("title=")[-1].split("&ct=")[0]
  95. vid = content["request"]["body"]["text"].split("vid=")[-1].split("&is_pay_subscribe")[0]
  96. request_info.append(title)
  97. request_info.append(vid)
  98. Feishu.update_values("recommend", "gzh", "VzrN7E", "B1:B1", [[title]])
  99. time.sleep(1)
  100. Feishu.update_values("recommend", "gzh", "VzrN7E", "B2:B2", [[vid]])
  101. for h in headers:
  102. if h["name"] == "cookie" and "pass_ticket" in h["value"]:
  103. pass_ticket = h["value"].split("pass_ticket=")[-1]
  104. # print(f"pass_ticket:{pass_ticket}")
  105. request_info.append(pass_ticket)
  106. Feishu.update_values("recommend", "gzh", "VzrN7E", "B5:B5", [[pass_ticket]])
  107. if h["name"] == "referer":
  108. __biz = h["value"].split("__biz=")[-1].split("&mid=")[0]
  109. # print(f"__biz:{__biz}")
  110. request_info.append(__biz)
  111. Feishu.update_values("recommend", "gzh", "VzrN7E", "B3:B3", [[__biz]])
  112. if h["name"] == "cookie" and "appmsg_token" in h["value"]:
  113. appmsg_token = h["value"].split("appmsg_token=")[-1]
  114. # print(f"appmsg_token:{appmsg_token}")
  115. request_info.append(appmsg_token)
  116. Feishu.update_values("recommend", "gzh", "VzrN7E", "B4:B4", [[appmsg_token]])
  117. if h["name"] == "cookie" and "wap_sid2" in h["value"]:
  118. wap_sid2 = h["value"].split("wap_sid2=")[-1]
  119. # print(f"wap_sid2:{wap_sid2}")
  120. request_info.append(wap_sid2)
  121. Feishu.update_values("recommend", "gzh", "VzrN7E", "B6:B6", [[wap_sid2]])
  122. return request_info
  123. # 获取视频下载链接
  124. @classmethod
  125. def get_url(cls, url):
  126. try:
  127. payload = {}
  128. headers = {
  129. 'Cookie': 'rewardsn=; wxtokenkey=777'
  130. }
  131. urllib3.disable_warnings()
  132. response = requests.get(url=url, headers=headers, data=payload, verify=False)
  133. response_list = response.text.splitlines()
  134. video_url_list = []
  135. for m in response_list:
  136. if "mpvideo.qpic.cn" in m:
  137. video_url = m.split("url: '")[1].split("',")[0].replace(r"\x26amp;", "&")
  138. video_url_list.append(video_url)
  139. video_url = video_url_list[0]
  140. return video_url
  141. except Exception as e:
  142. print(f"get_url异常:{e}")
  143. @classmethod
  144. def recommend(cls):
  145. token_sheet = Feishu.get_values_batch("recommend", "gzh", "VzrN7E")
  146. title = token_sheet[0][1]
  147. # print(title)
  148. # title = parse.urlencode(title)
  149. vid = token_sheet[1][1]
  150. __biz = token_sheet[2][1]
  151. appmsg_token = token_sheet[3][1]
  152. pass_ticket = token_sheet[4][1]
  153. wap_sid2 = token_sheet[5][1]
  154. # 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"
  155. # vid = "wxv_2512850656278560768"
  156. # __biz = "MzkwMjM4OTYyMA%3D%3D"
  157. # appmsg_token = "1177_uEP3JZFhlaEpfuX2xZkF7a5mr7y0GIw2Xtm6WmawNEjFdmTFLWIMx6XbC5z-mFgwQ6mWBq8Wh9EvcaVI"
  158. # pass_ticket = "1VEraA4AwklrT95KI+7WK09zHoybkPgSDgYX/Fw3ArRKYh+QnkI1NXGFHvZ0naeD"
  159. # wap_sid2 = "CNSn5r4HEooBeV9ISXFxZ1FWX1JPazhCVXlfWW5UU0dSbXpza0lHZnlKSDVUVF9aUndjeDhvbDctc0tfUGlWd09uOTVwcTVxWGVkenB5Nld2YkRKNFBKVk9jZVpJZTZGU2hXUkpnZlB5OTMwSEJXQVpTNS13NnJXY0hiTjJibkJ6U3Z3WllaRkNmcEwzWVNBQUF+MOzurZcGOA1AAQ=="
  160. print(f"title:{title}")
  161. print(f"vid:{vid}")
  162. print(f"__biz:{__biz}")
  163. print(f"appmsg_token:{appmsg_token}")
  164. print(f"pass_ticket:{pass_ticket}")
  165. print(f"wap_sid2:{wap_sid2}\n")
  166. url = "https://mp.weixin.qq.com/mp/getappmsgext?"
  167. headers = {
  168. # "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
  169. "content-type": 'text/plain',
  170. "accept": "*/*",
  171. "x-requested-with": "XMLHttpRequest",
  172. "accept-language": "zh-cn",
  173. "accept-encoding": "gzip, deflate, br",
  174. "origin": "https://mp.weixin.qq.com",
  175. "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 "
  176. "(KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.26(0x18001a29)"
  177. " NetType/WIFI Language/zh_CN",
  178. "referer": "https://mp.weixin.qq.com/s?"
  179. "__biz=" + __biz +
  180. "&mid=2247483669"
  181. "&idx=1"
  182. "&sn=b290af5fe2d28a02bf93721a10ce5106"
  183. "&chksm=c0a70b0ef7d0821846725445dfe838e64886f3a4ae12b8277be45f7977fcccc37591c63a526b"
  184. "&sessionid=1659598372"
  185. "&channel_session_id="
  186. "&scene=136"
  187. "&subscene=126"
  188. "&exptype="
  189. "&reloadid=1659598294"
  190. "&reloadseq=4"
  191. "&related_video_source=10"
  192. "&ascene=3"
  193. "&devicetype=iOS14.7.1"
  194. "&version=18001a29"
  195. "&nettype=WIFI"
  196. "&abtest_cookie=AAACAA%3D%3D"
  197. "&lang=zh_CN"
  198. "&session_us=gh_7364edd0ca9f"
  199. "&fontScale=100"
  200. "&exportkey=AQIwyyA%2BcjsvSOsvHeccwiE%3D"
  201. "&pass_ticket=" + pass_ticket +
  202. "&wx_header=3",
  203. }
  204. query_string = {
  205. "f": "json",
  206. "mock": "",
  207. "uin": "777",
  208. "key": "777",
  209. "pass_ticket": pass_ticket,
  210. "wxtoken": "",
  211. "devicetype": "iOS14.7.1",
  212. "clientversion": "18001a29",
  213. "__biz": __biz,
  214. "appmsg_token": appmsg_token,
  215. "x5": "0",
  216. # "f": "json"
  217. }
  218. cookies = {
  219. "appmsg_token": appmsg_token,
  220. "devicetype": "iOS14.7.1",
  221. "lang": "zh_CN",
  222. "pass_ticket": pass_ticket,
  223. "rewardsn": "",
  224. "version": "18001a29",
  225. "wap_sid2": wap_sid2,
  226. "wxtokenkey": "777",
  227. "wxuin": "2010747860"
  228. }
  229. form = {
  230. "r": "0.7399955678811934",
  231. "__biz": __biz,
  232. "appmsg_type": "9",
  233. "mid": "2247483669",
  234. "sn": "b290af5fe2d28a02bf93721a10ce5106",
  235. "idx": "1",
  236. "scene": "136",
  237. "title": title,
  238. "ct": "1659387788",
  239. "abtest_cookie": "AAACAA==",
  240. "devicetype": "iOS14.7.1",
  241. "version": "18001a29",
  242. "is_need_ticket": "0",
  243. "is_need_ad": "1",
  244. "comment_id": "0",
  245. "is_need_reward": "0",
  246. "both_ad": "0",
  247. "reward_uin_count": "0",
  248. "send_time": "",
  249. "msg_daily_idx": "1",
  250. "is_original": "0",
  251. "is_only_read": "1",
  252. "req_id": "0415gcfdToRrDu1wXSkK8VcK",
  253. "pass_ticket": pass_ticket,
  254. "is_temp_url": "0",
  255. "item_show_type": "5",
  256. "tmp_version": "1",
  257. "more_read_type": "0",
  258. "appmsg_like_type": "2",
  259. "related_video_sn": "",
  260. "related_video_num": "5",
  261. "vid": vid,
  262. "is_pay_subscribe": "0",
  263. "pay_subscribe_uin_count": "0",
  264. "has_red_packet_cover": "0",
  265. "album_id": "1296223588617486300",
  266. "album_video_num": "5",
  267. "cur_album_id": "",
  268. "is_public_related_video": "0",
  269. "encode_info_by_base64": "0",
  270. "exptype": ""
  271. }
  272. response = requests.post(url=url, headers=headers, cookies=cookies, params=query_string, data=form)
  273. if "related_tag_video" not in response.json():
  274. print(f"response:{response.text}\n")
  275. elif len(response.json()["related_tag_video"]) == 0:
  276. print(f"response:{response.text}\n")
  277. else:
  278. feeds = response.json()["related_tag_video"]
  279. for m in range(len(feeds)):
  280. # video_title
  281. if "title" not in feeds[m]:
  282. video_title = 0
  283. else:
  284. video_title = feeds[m]["title"]
  285. # video_title = base64.b64decode(video_title).decode("utf-8")
  286. # video_id
  287. if "vid" not in feeds[m]:
  288. video_id = 0
  289. else:
  290. video_id = feeds[m]["vid"]
  291. # play_cnt
  292. if "read_num" not in feeds[m]:
  293. play_cnt = 0
  294. else:
  295. play_cnt = feeds[m]["read_num"]
  296. # like_cnt
  297. if "like_num" not in feeds[m]:
  298. like_cnt = 0
  299. else:
  300. like_cnt = feeds[m]["like_num"]
  301. # duration
  302. if "duration" not in feeds[m]:
  303. duration = 0
  304. else:
  305. duration = feeds[m]["duration"]
  306. # video_width / video_height
  307. if "videoWidth" not in feeds[m] or "videoHeight" not in feeds[m]:
  308. video_width = 0
  309. video_height = 0
  310. else:
  311. video_width = feeds[m]["videoWidth"]
  312. video_height = feeds[m]["videoHeight"]
  313. # send_time
  314. if "pubTime" not in feeds[m]:
  315. send_time = 0
  316. else:
  317. send_time = feeds[m]["pubTime"]
  318. # user_name
  319. if "srcDisplayName" not in feeds[m]:
  320. user_name = 0
  321. else:
  322. user_name = feeds[m]["srcDisplayName"]
  323. # user_name = base64.b64decode(user_name).decode("utf-8")
  324. # user_id
  325. if "srcUserName" not in feeds[m]:
  326. user_id = 0
  327. else:
  328. user_id = feeds[m]["srcUserName"]
  329. # head_url
  330. if "head_img_url" not in feeds[m]:
  331. head_url = 0
  332. else:
  333. head_url = feeds[m]["head_img_url"]
  334. # cover_url
  335. if "cover" not in feeds[m]:
  336. cover_url = 0
  337. else:
  338. cover_url = feeds[m]["cover"]
  339. # video_url
  340. if "url" not in feeds[m]:
  341. video_url = 0
  342. else:
  343. video_url = feeds[m]["url"]
  344. # 下载链接
  345. download_url = cls.get_url(video_url)
  346. print(f"video_title:{video_title}")
  347. print(f"download_url:{download_url}")
  348. # print(f"video_id:{video_id}")
  349. # print(f"play_cnt:{play_cnt}")
  350. # print(f"like_cnt:{like_cnt}")
  351. # print(f"duration:{duration}")
  352. # print(f"video_width:{video_width}")
  353. # print(f"video_height:{video_height}")
  354. # print(f"send_time:{send_time}")
  355. # print(f"user_name:{user_name}")
  356. # print(f"user_id:{user_id}")
  357. # print(f"head_url:{head_url}")
  358. # print(f"cover_url:{cover_url}")
  359. # print(f"video_url:{video_url}")
  360. print("\n")
  361. @classmethod
  362. def get_sheet(cls):
  363. sheet = Feishu.get_values_batch("recommend", "gzh", "VzrN7E")
  364. print(sheet)
  365. print(sheet[0][1])
  366. print(sheet[1][1])
  367. print(sheet[2][1])
  368. print(sheet[3][1])
  369. print(sheet[4][1])
  370. print(sheet[5][1])
  371. if __name__ == "__main__":
  372. Demo.get_token()
  373. Demo.recommend()
  374. # Demo.get_sheet()