diff --git a/mas2ff2.py b/mas2ff2.py
new file mode 100644
index 0000000..f2467fe
--- /dev/null
+++ b/mas2ff2.py
@@ -0,0 +1,195 @@
+from mastodon import Mastodon
+import argparse
+import time
+import requests
+import re
+from datetime import datetime
+from loguru import logger
+import os
+
+# cookie = "u=%7EBVoC1S9tgw4; uuid=24edfe42401cbb03cf1f.1676446846.20; PHPSESSID=4ev7ef0f9cim18lrest8l52kn6; m=looo.ching%40gmail.com; tgw_l7_route=f174d6f255742a6ee2e9a07cf9cca0fa"
+# token = "9927e23b"
+logger.add('/root/develop/log/mas2ff-hegui.log', level='INFO')
+def post_fanfou(cookie, token, fanfou_status, images=None):
+ if not images:
+ images = []
+ # post status
+ if not images:
+ try:
+ response = requests.post(
+ url="https://m.fanfou.com/home",
+ params={
+ "v": str(int(datetime.timestamp(datetime.now()))),
+ },
+ headers={
+ "Authority": "m.fanfou.com",
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6",
+ "Cache-Control": "max-age=0",
+ "Content-Type": "application/x-www-form-urlencoded",
+ "Cookie": cookie,
+ "Origin": "https://m.fanfou.com",
+ "Referer": "https://m.fanfou.com/home",
+ "Sec-Ch-Ua": "\"Chromium\";v=\"118\", \"Google Chrome\";v=\"118\", \"Not=A?Brand\";v=\"99\"",
+ "Sec-Ch-Ua-Mobile": "?0",
+ "Sec-Ch-Ua-Platform": "\"macOS\"",
+ "Sec-Fetch-Dest": "document",
+ "Sec-Fetch-Mode": "navigate",
+ "Sec-Fetch-Site": "same-origin",
+ "Sec-Fetch-User": "?1",
+ "Upgrade-Insecure-Requests": "1",
+ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
+ "Accept-Encoding": "gzip",
+ },
+ data={
+ "content": fanfou_status,
+ "token": token,
+ "action": "msg.post",
+ },
+ )
+ logger.info('%s, Response status code: %s' % (fanfou_status,
+ response.status_code))
+ if not '你在做什么?' in response.text:
+ logger.error('Post %s maybe failed', fanfou_status)
+ except requests.exceptions.RequestException:
+ logger.error('Post %s failed', fanfou_status)
+
+ else:
+ # post with images
+ image_urls = [media['url'] for media in images if media['type'] == 'image']
+ image_count = ''
+ if len(image_urls) > 1:
+ image_count = '(%%s/%s)' % len(image_urls)
+
+ headers = {
+ "Authority": "m.fanfou.com",
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6",
+ "Cache-Control": "max-age=0",
+ "Cookie": cookie,
+ "Origin": "https://m.fanfou.com",
+ "Referer": "https://m.fanfou.com/photo.upload",
+ "Sec-Ch-Ua": "\"Chromium\";v=\"118\", \"Google Chrome\";v=\"118\", \"Not=A?Brand\";v=\"99\"",
+ "Sec-Ch-Ua-Mobile": "?0",
+ "Sec-Ch-Ua-Platform": "\"macOS\"",
+ "Sec-Fetch-Dest": "document",
+ "Sec-Fetch-Mode": "navigate",
+ "Sec-Fetch-Site": "same-origin",
+ "Sec-Fetch-User": "?1",
+ "Upgrade-Insecure-Requests": "1",
+ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
+ "Accept-Encoding": "gzip",
+ }
+
+ for x in range(len(image_urls)):
+ try:
+ image_resp = requests.get(image_urls[x])
+ status = fanfou_status
+ if image_count:
+ status = fanfou_status + ' ' + image_count % (x+1)
+ if image_resp.status_code == 200:
+ # 创建一个临时文件
+ with open('temp.jpg', 'wb') as file:
+ file.write(response.content)
+
+ # 确保文件存在
+ if os.path.exists('temp.jpg'):
+ with open('temp.jpg', 'rb') as file:
+ # 以下是您的multipart/form-data请求部分
+ files = {
+ 'picture': ('temp.jpg', file, 'image/jpeg') # 注意这里仍然需要指定MIME类型
+ }
+ data = {
+ 'desc': status,
+ 'action': 'photo.upload',
+ 'photo': '',
+ 'token': token,
+ }
+ # 发送请求
+ try:
+ response = requests.post("https://m.fanfou.com/home/upload",
+ headers=headers,
+ files=files,
+ data=data)
+ logger.info('%s, Response status code: %s' % (status,
+ response.status_code))
+ except requests.exceptions.RequestException:
+ logger.error('Post %s failed', status)
+ except:
+ continue
+
+def run(instance, access_token, fanfou_cookie, fanfou_token):
+
+ mastodon_cli = Mastodon(
+ access_token=access_token, api_base_url=instance)
+ me_info = mastodon_cli.me()
+ me_id = me_info['id']
+ me_timeline = mastodon_cli.account_statuses(
+ me_id, exclude_replies=True)
+ min_id = None
+ max_id = None
+ # first time run
+ # init min_id
+ for status in me_timeline:
+ if not status['reblog'] and status['visibility'] == 'public':
+ min_id = status['id']
+ logger.info(status['content'])
+ break
+ # if is in already posted status
+ posted_ids = []
+ # if file not exist, create it
+ with open('last_id.txt', 'a+') as f:
+ f.seek(0)
+ # read lines
+ posted_ids = f.readlines()
+ # remove \n
+ posted_ids = [x.strip() for x in posted_ids]
+ #print(posted_ids)
+ if str(min_id) not in posted_ids:
+ content = status['content'].replace('
', '\n')
+ content = re.sub('<.*?>', '', content)
+ post_fanfou(fanfou_cookie, fanfou_token, content, status['media_attachments'])
+ # write to file
+ with open('last_id.txt', 'a') as f:
+ f.write(str(min_id) + '\n')
+ posted_ids.append(min_id)
+ logger.info('write toot')
+
+ time.sleep(10)
+
+ while True:
+ requests.get('https://up.tunpok.com/api/push/sQLwSpeiUH?msg=OK&ping=')
+ # get new status
+ me_timeline = mastodon_cli.account_statuses(
+ me_id, exclude_replies=True, min_id=min_id)
+ # if no new status
+ if not me_timeline:
+ time.sleep(10)
+ continue
+ statuses = []
+ for status in me_timeline:
+ statuses.append(status)
+ statuses.reverse()
+ for status in statuses:
+ if not status['reblog'] and status['visibility'] == 'public':
+ if str(status['id']) not in posted_ids:
+ content = status['content'].replace('
', '\n')
+ content = re.sub('<.*?>', '', content)
+ logger.info(status['id'], content)
+ post_fanfou(fanfou_cookie, fanfou_token, content, status['media_attachments'])
+ with open('last_id.txt', 'a') as f:
+ f.write(str(status['id']) + '\n')
+ posted_ids.append(status['id'])
+ logger.info('write toot %s', status['content'])
+ time.sleep(10)
+ # update min_id
+ if statuses:
+ min_id = statuses[-1]['id']
+
+if __name__ == '__main__':
+ cookie = 'u=stokesia; uuid=24edfe42401cbb03cf1f.1676446846.21; PHPSESSID=d4l9m3tp09gasff6r3u8mv9p12; m=yvettezhong%40gmail.com; tgw_l7_route=f174d6f255742a6ee2e9a07cf9cca0fa'
+ token = '742ac481'
+ m_ins = 'https://nofan.xyz'
+ m_token = 'C5zKq2Mf54E7gaSDe47Bds080ySpsdvaykZBAtt5jvo'
+ run(m_ins, m_token, cookie, token)
+