Twitter parsing activation

This commit is contained in:
Soxoj
2021-01-14 03:26:12 +03:00
parent c4210fa64e
commit cb2318a4a1
6 changed files with 66 additions and 2 deletions
+12
View File
@@ -0,0 +1,12 @@
import requests
class ParsingActivator:
@staticmethod
def twitter(site, logger):
headers = dict(site.headers)
del headers['x-guest-token']
r = requests.post(site.activation['url'], headers=headers)
logger.info(r)
j = r.json()
guest_token = j[site.activation['src']]
site.headers['x-guest-token'] = guest_token
+14
View File
@@ -23,6 +23,7 @@ import tqdm.asyncio
from mock import Mock from mock import Mock
from socid_extractor import parse, extract from socid_extractor import parse, extract
from .activation import ParsingActivator
from .notify import QueryNotifyPrint from .notify import QueryNotifyPrint
from .result import QueryResult, QueryStatus from .result import QueryResult, QueryStatus
from .sites import MaigretDatabase, MaigretSite from .sites import MaigretDatabase, MaigretSite
@@ -183,6 +184,17 @@ def process_site_result(response, query_notify, logger, results_info, site: Maig
error_text, site_error_text = detect_error_page(html_text, status_code, failure_errors, error_text, site_error_text = detect_error_page(html_text, status_code, failure_errors,
site.ignore_403) site.ignore_403)
if site.activation:
is_need_activation = any([s for s in site.activation['marks'] if s in html_text])
if is_need_activation:
method = site.activation['method']
try:
activate_fun = getattr(ParsingActivator(), method)
# TODO: async call
activate_fun(site, logger)
except AttributeError:
logger.warning(f'Activation method {method} for site {site.name} not found!')
# presense flags # presense flags
# True by default # True by default
presense_flags = site.presense_strs presense_flags = site.presense_strs
@@ -888,6 +900,8 @@ async def main():
if pathPDF or pathHTML: if pathPDF or pathHTML:
save_html_pdf_report(general_results,pathHTML,pathPDF) save_html_pdf_report(general_results,pathHTML,pathPDF)
db.save_to_file(args.json_file)
def run(): def run():
try: try:
+10 -1
View File
@@ -13416,7 +13416,7 @@
"sec-ch-ua": "Google Chrome\";v=\"87\", \" Not;A Brand\";v=\"99\", \"Chromium\";v=\"87\"", "sec-ch-ua": "Google Chrome\";v=\"87\", \" Not;A Brand\";v=\"99\", \"Chromium\";v=\"87\"",
"authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA", "authorization": "Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
"x-guest-token": "1348265069432479753" "x-guest-token": "1349509919867854849"
}, },
"errors": { "errors": {
"Bad guest token": "x-guest-token update required" "Bad guest token": "x-guest-token update required"
@@ -13425,6 +13425,15 @@
"checkType": "message", "checkType": "message",
"absenceStrs": "Not found", "absenceStrs": "Not found",
"alexaRank": 55, "alexaRank": 55,
"activation": {
"method": "twitter",
"marks": [
"Bad guest token."
],
"url": "https://api.twitter.com/1.1/guest/activate.json",
"src": "guest_token",
"dst": "x-guest-token"
},
"url": "https://twitter.com/{username}", "url": "https://twitter.com/{username}",
"urlMain": "https://www.twitter.com/", "urlMain": "https://www.twitter.com/",
"usernameClaimed": "blue", "usernameClaimed": "blue",
+1
View File
@@ -33,6 +33,7 @@ class MaigretSite:
self.type = 'username' self.type = 'username'
self.headers = {} self.headers = {}
self.errors = {} self.errors = {}
self.activation = {}
self.url_subpath = '' self.url_subpath = ''
self.regex_check = None self.regex_check = None
self.url_probe = None self.url_probe = None
+13 -1
View File
@@ -1,6 +1,11 @@
from _pytest.mark import Mark from _pytest.mark import Mark
from mock import Mock
import os
import pytest
from maigret.sites import MaigretDatabase, MaigretSite
JSON_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../maigret/resources/data.json')
empty_mark = Mark('', [], {}) empty_mark = Mark('', [], {})
@@ -9,4 +14,11 @@ def by_slow_marker(item):
def pytest_collection_modifyitems(items): def pytest_collection_modifyitems(items):
items.sort(key=by_slow_marker, reverse=False) items.sort(key=by_slow_marker, reverse=False)
@pytest.fixture(scope='session')
def default_db():
db = MaigretDatabase().load_from_file(JSON_FILE)
return db
+16
View File
@@ -0,0 +1,16 @@
"""Maigret activation test functions"""
from mock import Mock
import pytest
from maigret.activation import ParsingActivator
@pytest.mark.slow
def test_twitter_activation(default_db):
twitter_site = default_db.sites_dict['Twitter']
token1 = twitter_site.headers['x-guest-token']
ParsingActivator.twitter(twitter_site, Mock())
token2 = twitter_site.headers['x-guest-token']
assert token1 != token2