resetting master branch

This commit is contained in:
houndvoyager 2022-09-02 13:46:05 +02:00
commit f03cc75f2b
5 changed files with 152 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
__pycache__/
test.py
.env
venv/

28
README.md Normal file
View File

@ -0,0 +1,28 @@
# Suchbot, a bot for suchmemes ._.
# Supported platforms:
- [x] Mastodon (Come check it out at [@wownero](https://mastodon.social/@wownero))
- [x] Tumblr (only posts image due to the package limitations. Check out the feed here: [wownero](https://wownero.tumblr.com/)
- [ ] XMPP
- [ ] IRC
## It uses a [Supabase](https://supabase.com/) database to store the json from https://suchwow.xyz/api/list.
> Posts image data directly to services without storing it.
# Reproducing:
To reproduce, set up a .env with the following and install the necessary modules found in `requirements.txt`:
```
SUPABASE_URL=
SUPABASE_KEY=
Mastodon:
MAST_TOKEN=
Tumblr:
consumer_key=
consumer_secret=
oauth_token=
oauth_secret=
```

45
main.py Normal file
View File

@ -0,0 +1,45 @@
import httpx
import time
import modules
import os
from dotenv import load_dotenv
from supabase import create_client, Client
load_dotenv()
url: str = os.environ.get("SUPABASE_URL")
key: str = os.environ.get("SUPABASE_KEY")
supabase: Client = create_client(url, key)
def scraper():
transport = httpx.HTTPTransport(retries=5)
client = httpx.Client(transport=transport)
api_list = client.get("https://suchwow.xyz/api/list", timeout=100).json()
api_list.reverse()
for item in api_list:
try:
supabase.table("suchmeme").insert(item).execute()
print(f'Inserted meme {item["id"]} to Supabase DB')
post(item)
except Exception as e:
if 'duplicate key value violates unique constraint' in str(e):
print("Meme already exists")
continue
else:
print(f'Error upon inserting data in DB with meme {item["id"]} due to {e}')
continue
def post(item):
modules.masto(item)
modules.tumblr(item)
while True:
try:
scraper()
except Exception as e:
print(e)
print("Database updated")
time.sleep(120)

38
modules.py Normal file
View File

@ -0,0 +1,38 @@
from mastodon import Mastodon
import pytumblr2
import mimetypes
import httpx
import os
from dotenv import load_dotenv
load_dotenv()
def masto(post):
mastodon = Mastodon(
access_token=os.environ.get("MAST_TOKEN"),
api_base_url='https://mastodon.social'
)
try:
i = httpx.get(post["image"]).content
mime = mimetypes.guess_type(post["image"], strict=True)[0]
media_ids = mastodon.media_post(i, mime, description=f'{post["title"]}')["id"]
media_ids = [media_ids]
content = f'New meme by {post["submitter"]}!\n{post["title"]} - {post["text"]}\n{post["href"]}'
mastodon.status_post(content, media_ids=media_ids)
print(f'Posted {post["id"]} to Mastodon @wownero')
except Exception as e:
print(e)
def tumblr(post):
client = pytumblr2.TumblrRestClient(
os.environ.get("consumer_key"),
os.environ.get("consumer_secret"),
os.environ.get("oauth_token"),
os.environ.get("oauth_secret"),
)
client.legacy_create_photo("wownero", state="published", tags=["wownero", "such", "meme", "wow", "memes"], caption=f'New meme by {post["submitter"]}!\n{post["title"]} - {post["text"]}', link=f'{post["href"]}',
source=post["image"])

37
requirements.txt Normal file
View File

@ -0,0 +1,37 @@
anyio==3.5.0
blurhash==1.1.4
certifi==2021.10.8
charset-normalizer==2.0.12
decorator==5.1.1
deprecation==2.1.0
dnspython==2.2.1
future==0.18.2
gotrue==0.5.0
h11==0.12.0
httpcore==0.14.7
httpx==0.21.3
idna==3.3
Mastodon.py==1.5.1
oauthlib==3.2.0
packaging==21.3
Pillow==9.0.1
postgrest-py==0.9.2
psycopg2==2.9.3
pydantic==1.9.0
pymongo==4.0.2
pyparsing==3.0.7
python-dateutil==2.8.2
python-dotenv==0.19.2
python-magic==0.4.25
PyTumblr2==0.2.2
pytz==2022.1
realtime==0.0.4
requests==2.27.1
requests-oauthlib==1.3.1
rfc3986==1.5.0
six==1.16.0
sniffio==1.2.0
supabase==0.5.3
typing-extensions==4.1.1
urllib3==1.26.9
websockets==9.1