48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
|
import csv
|
||
|
import time
|
||
|
import requests
|
||
|
|
||
|
import fire
|
||
|
|
||
|
RepostAPI = "https://m.weibo.cn/api/statuses/repostTimeline"
|
||
|
|
||
|
class Main():
|
||
|
def _get_repost_page(self, weiboId, page, session=requests):
|
||
|
params = {"id": weiboId, "page": page}
|
||
|
response = session.get(RepostAPI, params=params)
|
||
|
return response.json()
|
||
|
|
||
|
def _get_reposts(self, cookie, weiboId, wait):
|
||
|
max_page = None
|
||
|
i = 0
|
||
|
with requests.Session() as session:
|
||
|
session.headers.update({"Cookie": cookie})
|
||
|
while max_page is None or i < max_page:
|
||
|
i += 1
|
||
|
print(f"Fetching page {i}...")
|
||
|
page = self._get_repost_page(weiboId, i, session)
|
||
|
if max_page is None:
|
||
|
max_page = page["data"]["max"]
|
||
|
for repost in page["data"]["data"]:
|
||
|
yield repost
|
||
|
time.sleep(wait)
|
||
|
|
||
|
def _to_row(self, repost):
|
||
|
user = repost["user"]["screen_name"]
|
||
|
time = repost["created_at"]
|
||
|
text = repost["raw_text"]
|
||
|
url = f'https://www.weibo.com/{repost["user"]["id"]}/{repost["bid"]}'
|
||
|
return [user, time, text, url]
|
||
|
|
||
|
def fetch_reposts(self, output, wait=1):
|
||
|
weiboId = input("Weibo ID: ")
|
||
|
cookie = input("Cookie: ")
|
||
|
with open(output, "w", newline="") as f:
|
||
|
writer = csv.writer(f)
|
||
|
writer.writerow(["User", "Time", "Text", "URL"])
|
||
|
for repost in self._get_reposts(cookie, weiboId, wait):
|
||
|
writer.writerow(self._to_row(repost))
|
||
|
print(f"Reposts saved to {output}")
|
||
|
|
||
|
fire.Fire(Main)
|