Commit 10b20d1a authored by minamotorin's avatar minamotorin Committed by GitHub

Merge pull request #2 from minamotorin/twintproject/twint#1335

Twintproject/twint#1335
parents e643a479 c31661d6
...@@ -12,6 +12,18 @@ This problem doesn't happen recently. ...@@ -12,6 +12,18 @@ This problem doesn't happen recently.
- [twintproject/twint#1061](https://github.com/twintproject/twint/issues/1061) - [twintproject/twint#1061](https://github.com/twintproject/twint/issues/1061)
- [twintproject/twint#1114](https://github.com/twintproject/twint/issues/1114) - [twintproject/twint#1114](https://github.com/twintproject/twint/issues/1114)
### json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
The fix is **not complete**.
`twint.run.Profile` will work but `twint.run.db` will not.
This means [`test.py`](./test.py) causes an error.
I think this is because the fields of the result table are not exactly the same as the traditional ones.
#### Related
- [twintproject/twint#1335](https://github.com/twintproject/twint/issues/1335)
# TWINT - Twitter Intelligence Tool # TWINT - Twitter Intelligence Tool
![2](https://i.imgur.com/iaH3s7z.png) ![2](https://i.imgur.com/iaH3s7z.png)
![3](https://i.imgur.com/hVeCrqL.png) ![3](https://i.imgur.com/hVeCrqL.png)
......
...@@ -59,9 +59,12 @@ def _get_cursor(response): ...@@ -59,9 +59,12 @@ def _get_cursor(response):
next_cursor = response['timeline']['instructions'][0]['addEntries']['entries'][-1]['content'][ next_cursor = response['timeline']['instructions'][0]['addEntries']['entries'][-1]['content'][
'operation']['cursor']['value'] 'operation']['cursor']['value']
except KeyError: except KeyError:
try:
# this is needed because after the first request location of cursor is changed # this is needed because after the first request location of cursor is changed
next_cursor = response['timeline']['instructions'][-1]['replaceEntry']['entry']['content']['operation'][ next_cursor = response['timeline']['instructions'][-1]['replaceEntry']['entry']['content']['operation'][
'cursor']['value'] 'cursor']['value']
except KeyError:
next_cursor = response['timeline']['instructions'][0]['entries'][-1]['content']['value']
return next_cursor return next_cursor
...@@ -77,10 +80,11 @@ def Json(response): ...@@ -77,10 +80,11 @@ def Json(response):
def parse_tweets(config, response): def parse_tweets(config, response):
logme.debug(__name__ + ':parse_tweets') logme.debug(__name__ + ':parse_tweets')
response = loads(response) response = loads(response)
feed = []
if 'globalObjects' in response:
if len(response['globalObjects']['tweets']) == 0: if len(response['globalObjects']['tweets']) == 0:
msg = 'No more data!' msg = 'No more data!'
raise NoMoreTweetsException(msg) raise NoMoreTweetsException(msg)
feed = []
for timeline_entry in response['timeline']['instructions'][0]['addEntries']['entries']: for timeline_entry in response['timeline']['instructions'][0]['addEntries']['entries']:
# this will handle the cases when the timeline entry is a tweet # this will handle the cases when the timeline entry is a tweet
if (config.TwitterSearch or config.Profile) and (timeline_entry['entryId'].startswith('sq-I-t-') or if (config.TwitterSearch or config.Profile) and (timeline_entry['entryId'].startswith('sq-I-t-') or
...@@ -118,5 +122,12 @@ def parse_tweets(config, response): ...@@ -118,5 +122,12 @@ def parse_tweets(config, response):
'retweet_date': _dt, 'retweet_date': _dt,
} }
feed.append(temp_obj) feed.append(temp_obj)
else:
response = response['data']['user']['result']['timeline']
for timeline_entry in response['timeline']['instructions'][0]['entries']:
if timeline_entry['content'].get('itemContent'):
temp_obj = timeline_entry['content']['itemContent']['tweet_results']['result']['legacy']
temp_obj['user_data'] = timeline_entry['content']['itemContent']['tweet_results']['result']['core']['user_results']['result']['legacy']
feed.append(temp_obj)
next_cursor = _get_cursor(response) next_cursor = _get_cursor(response)
return feed, next_cursor return feed, next_cursor
import datetime import datetime
import json
from sys import platform from sys import platform
import logging as logme import logging as logme
from urllib.parse import urlencode from urllib.parse import urlencode
...@@ -168,37 +169,27 @@ async def Search(config, init): ...@@ -168,37 +169,27 @@ async def Search(config, init):
def SearchProfile(config, init=None): def SearchProfile(config, init=None):
logme.debug(__name__ + ':SearchProfile') logme.debug(__name__ + ':SearchProfile')
_url = 'https://api.twitter.com/2/timeline/profile/{user_id}.json'.format(user_id=config.User_id) _url = 'https://twitter.com/i/api/graphql/CwLU7qTfeu0doqhSr6tW4A/UserTweetsAndReplies'
tweet_count = 100 tweet_count = 100
params = [ variables = {
# some of the fields are not required, need to test which ones aren't required "userId": config.User_id,
('include_profile_interstitial_type', '1'), "count": tweet_count,
('include_blocking', '1'), "includePromotedContent": True,
('include_blocked_by', '1'), "withCommunity": True,
('include_followed_by', '1'), "withSuperFollowsUserFields": True,
('include_want_retweets', '1'), "withBirdwatchPivots": False,
('include_mute_edge', '1'), "withDownvotePerspective": False,
('include_can_dm', '1'), "withReactionsMetadata": False,
('include_can_media_tag', '1'), "withReactionsPerspective": False,
('skip_status', '1'), "withSuperFollowsTweetFields": True,
('cards_platform', 'Web - 12'), "withVoice": True,
('include_cards', '1'), "withV2Timeline": False,
('include_ext_alt_text', 'true'), "__fs_interactive_text": False,
('include_quote_count', 'true'), "__fs_dont_mention_me_view_api_enabled": False,
('include_reply_count', '1'), }
('tweet_mode', 'extended'),
('include_entities', 'true'),
('include_user_entities', 'true'),
('include_ext_media_color', 'true'),
('include_ext_media_availability', 'true'),
('send_error_codes', 'true'),
('simple_quoted_tweet', 'true'),
('include_tweet_replies', 'true'),
('count', tweet_count),
('ext', 'mediaStats%2ChighlightedLabel'),
]
if type(init) == str: if type(init) == str:
params.append(('cursor', str(init))) variables['cursor'] = init
params = [('variables', json.dumps(variables, separators=(',',':')))]
_serialQuery = _sanitizeQuery(_url, params) _serialQuery = _sanitizeQuery(_url, params)
return _url, params, _serialQuery return _serialQuery, [], _serialQuery
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment