Bladeren bron

feat: //WIP before пр actions

But add some features and addons:
- fix bugs with backslahes
- add always abstract of paper
metya 4 jaren geleden
bovenliggende
commit
4594cc74d6
7 gewijzigde bestanden met toevoegingen van 68 en 30 verwijderingen
  1. 4 0
      .gitignore
  2. 2 3
      Dockerfile
  3. 6 1
      config.py
  4. BIN
      pipchillreq.txt
  5. 4 1
      prod-requirements.txt
  6. 7 0
      requirements.txt
  7. 45 25
      vanitybot.py

+ 4 - 0
.gitignore

@@ -6,6 +6,10 @@ __pycache__/
 # C extensions
 *.so
 
+# Jupyter
+.ipynb_checkpoints
+*.ipynb
+
 # Distribution / packaging
 .Python
 build/

+ 2 - 3
Dockerfile

@@ -4,15 +4,14 @@ ENV PIP_NO_CACHE_DIR=off \
     PIP_DISABLE_PIP_VERSION_CHECK=on
 ARG API_TOKEN
 
+RUN apk add --no-cache --virtual .build-deps gcc musl-dev
+
 WORKDIR /app
 ADD prod-requirements.txt /app
-
-RUN apk add --no-cache --virtual .build-deps gcc musl-dev
 RUN pip install --no-cache-dir -r prod-requirements.txt
 RUN apk del .build-deps
 
 ADD . /app
-RUN echo API_TOKEN=$API_TOKEN > config.py
 
 # EXPOSE 8081
 

+ 6 - 1
config.py

@@ -1,2 +1,7 @@
+from os import getenv
+from dotenv import dotenv_values
 
-API_TOKEN = 'token'
+if env_var := dotenv_values('token'):
+    API_TOKEN = env_var["API_TOKEN"]
+else:
+    API_TOKEN = getenv("API_TOKEN")

BIN
pipchillreq.txt


+ 4 - 1
prod-requirements.txt

@@ -1,2 +1,5 @@
 aiogram
-logzero
+logzero
+beautifulsoup4
+python-dotenv
+requests

+ 7 - 0
requirements.txt

@@ -0,0 +1,7 @@
+logzero==1.6.3
+requests==2.25.1
+aiogram==2.11.2
+attrs==20.3.0
+attr==0.3.1
+beautifulsoup4==4.9.3
+python-dotenv==0.16.0

+ 45 - 25
vanitybot.py

@@ -1,45 +1,65 @@
-from aiogram.types import message
-from aiogram.types.message import Message
-from logzero import logger
+import re
 import logging
-
+from attr import __description__
+from logzero import logger
+from aiogram.types import message
+from aiogram.types.message import Message, ParseMode
 from aiogram import Bot, Dispatcher, executor, types
 from config import API_TOKEN
+from bs4 import BeautifulSoup
+from requests import get
+from contextlib import suppress
 
 # Configure logging
 logging.basicConfig(level=logging.INFO)
 
+# utils funtions
+def get_paper_desc(id_paper: str) -> tuple:
+    
+    request = get(f'https://arxiv.org/abs/{id_paper}')
+    if request.ok:
+        soup = BeautifulSoup(request.content)
+        with suppress(TypeError): 
+            url = soup.find('meta', property='og:url').get('content')
+            title = soup.find('meta', property='og:title').get('content')
+            description = soup.find('meta', property='og:description').get('content').replace('\n', '')
+            return url, title, description
+    
+    return None
+
 # Initialize bot and dispatcher
 bot = Bot(token=API_TOKEN)
 dp = Dispatcher(bot)
 
-@dp.message_handler(commands=['start'])
-async def process_start_command(message: types.Message):
-    await message.reply("Hello!\n\n\
+help_message = "Hello!\n\n\
 Send me a link paper from arxiv.org and \
-I'll send you back arxiv-vanity.com link with paper!\n\
+I'll send you back snipet of paper and arxiv-vanity.com mobile friendly link!\n\
 Or add me to chat and I'll be watching the arxiv link and \
-reply to them with fancy axiv-vanity links.")
+reply to them with fancy axiv-vanity links."
+
+@dp.message_handler(commands=['start'])
+async def process_start_command(message: types.Message):
+    await message.reply(help_message)
 
 
 @dp.message_handler(commands=['help'])
 async def process_help_command(message: types.Message):
-    await message.reply("Напиши мне что-нибудь, и я отпрпавлю этот текст тебе в ответ!")
-
-
-# @dp.message_handler()
-# async def echo_message(message: types.Message):
-#     await bot.send_message(message.from_user.id, message.text)
-
-@dp.message_handler(regexp='arxiv.org/\s*([^\s]*)')
-async def cats(message: types.Message):
-    id_paper = (message.text
-                .replace('/abs', '')
-                .replace('/pdf', '')
-                .replace('.pdf', '')
-                .split('/')[-1]
-                .split(' ')[0])
-    await message.reply(f'https://arxiv-vanity.com/papers/{id_paper}')
+    await message.reply(help_message)
+
+
+@dp.message_handler(regexp='arxiv.org\/(?:abs|pdf)\/\d{4}\.\d{5}')
+async def vanitify(message: types.Message):
+    papers_ids = re.findall(r'arxiv.org\/(?:abs|pdf)\/(\d{4}\.\d{5})', message.text)
+    
+    for id_ in papers_ids:
+        reply_message = f"[Here you can read the paper in mobile friendly way](https://www.arxiv-vanity.com/papers/{id_})"
+
+        if desc := get_paper_desc(id_):
+            url, title, description = desc
+            reply_message = f'{url}\n\n***{title}***\n\n{description}\n\n{reply_message}'
+        
+            
+        await message.reply(reply_message, parse_mode=ParseMode.MARKDOWN)
 
 
 if __name__ == "__main__":