__init__.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. """
  2. """
  3. import json
  4. import logging
  5. from playwright.sync_api import sync_playwright, Page, Playwright
  6. import api
  7. from browser import BaseBrowser
  8. from util.lock_util import LockManager
  9. from instagram.data_handler import *
  10. IG_URL = 'https://www.instagram.com/'
  11. lock_manager = LockManager()
  12. def get_post_id(url: str) -> str:
  13. match = re.search(r'instagram\.com/(?:[^/]+/)?p/([^/?]+)', url)
  14. return match.group(1) if match else None
  15. class InstagramBrowser(BaseBrowser):
  16. def __init__(self, account: str, playwright=None):
  17. super().__init__(account, playwright)
  18. self.id = None
  19. def __get_name__(self):
  20. return 'instagram'
  21. def __invoke__(self, lambda_func, *args, **kwargs):
  22. lock_manager.acquire_lock(self.account)
  23. try:
  24. with sync_playwright() as playwright:
  25. self.__init_browser__(playwright)
  26. return lambda_func(*args, **kwargs)
  27. finally:
  28. lock_manager.release_lock(self.account)
  29. def search_blog(self, url):
  30. api.assert_not_none(url, 'url不能为空')
  31. self.result = None
  32. self.map_result = {}
  33. self.id = get_post_id(url)
  34. self.browser.on('response', self.blog_info_handler)
  35. self.page.goto(url)
  36. self.page.wait_for_timeout(1000)
  37. self.browser.on('response', self.user_info_handler)
  38. if self.result is not None:
  39. # 将鼠标光标放到头像上,获取粉丝等数据信息
  40. username = self.result['user'].get('username')
  41. head_ele = self.page.locator(f'img[alt="{username}的头像"]')
  42. head_ele.nth(0).hover()
  43. self.page.wait_for_timeout(1000)
  44. if self.map_result.get('author') is not None:
  45. self.result['user'].update(self.map_result['author'])
  46. return self.result
  47. def blog_info_handler(self, response):
  48. if response is None or response.status != 200:
  49. return
  50. if '/info' in response.url:
  51. info = get_blog_by_rsp(response)
  52. if info is not None:
  53. self.result = info
  54. elif self.id in response.url:
  55. logging.info(f'get {self.id} blog response')
  56. doc = get_blog_by_doc(response)
  57. if doc is not None:
  58. self.result = doc
  59. def user_info_handler(self, response):
  60. if response is None or response.status != 200:
  61. return
  62. if '/graphql/query' in response.url:
  63. req_params = response.request.post_data_json.get('variables')
  64. if req_params is not None:
  65. req_body = json.loads(req_params)
  66. if 'userID' in req_body:
  67. self.map_result['author'] = get_user_by_request(response)