自動でArxivから論文を取得して、日本語に直してLineに投稿すれば、受動的に最新情報が収集できるかも！？

# はじめに
最先端の論文は知りたいけど、時間が無くて論文を読む気にならない。。。
arXiv見ても英語でよくわからないから、日本語がよい。。。
Slackとかよくわかんないし、Lineに通知して欲しい。。。

ということで、これらを満たすようなシステムを構成してみました！

実行イメージはこんな感じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/43669156-cf8f-7f39-dffe-fb6f157f4d52.png)

# 追記★20210421
翻訳でエラーが出たら下記参照！
https://qiita.com/_yushuu/items/83c51e29771530646659

# システム構成
こんな感じで実装していきます。トリガーは、Pythonコード実行です。
①～③をpythonコード上に記述し、④、⑤はIFTTTの設定で行います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/080fe3ce-6401-7310-f7e1-fbcba26125bb.png)

ちなみに、IFTTTの設定を変えれば、投稿先をlineから簡単にslackやtwitterに変えることができます。

では、各々について説明していきます。

# ①～③：論文取得からPOSTまでの実装
arxivからの取得コードに関しては、下記URLを参考（流用）しております。HK様感謝。
参考 : [Slackで論文収集botを作る](https://kusanohitoshi.blogspot.com/2017/05/slackbot.html)

主な変更点は２点
 ①：取得したAbstをGoogle翻訳にかけている
 ②：Post先がIFTTTのwebhook
となります。

コードの下に、個々の環境で動作させるための変更点が記述してあります。

```arxiv2line.py
from datetime import datetime
import re
import requests
import pickle
import os
from googletrans import Translator

import requests

# webhook POST先URL
API_URL = "https://maker.ifttt.com/trigger/<IFTTTに設定するイベント名>/with/key/<IFTTTでの個人用KEY>"

# 検索ワード
QUERY = "(cat:cs.CV)+AND+(abs:depth)"



def parse(data, tag):
    # parse atom file
    # e.g. Input :<tag>XYZ </tag> -> Output: XYZ

    pattern = "<" + tag + ">([\s\S]*?)<\/" + tag + ">"
    if all:
        obj = re.findall(pattern, data)
    return obj


def search_and_send(query, start, ids, api_url):
    translator = Translator()
    while True:
        counter = 0

        url = 'http://export.arxiv.org/api/query?search_query=' + query + '&start=' + str(
            start) + '&max_results=100&sortBy=lastUpdatedDate&sortOrder=descending'
        # Get returned value from arXiv API
        data = requests.get(url).text
        # Parse the returned value
        entries = parse(data, "entry")
        for entry in entries:
            # Parse each entry
            url = parse(entry, "id")[0]
            if not (url in ids):
                # parse
                title = parse(entry, "title")[0]
                abstract = parse(entry, "summary")[0]
                date = parse(entry, "published")[0]

                # abstの改行を取る
                abstract = abstract.replace('\n', '')

                # 日本語化 ★②の部分
                title_jap = translator.translate(title, dest='ja')
                abstract_jap = translator.translate(abstract, dest='ja')

                message = "\n".join(
                     ["<br>Title:  " + title, "<br><br>URL: " + url, "<br><br>Published: " + date, "<br><br>JP_Abstract: " + abstract_jap.text])             
                
                # webhookへPost ★①の部分
                response = requests.post(api_url, data={"value1": message})

                
                ids.append(url)
                counter = counter + 1
                if counter == 10:
                    return 0
        if counter == 0 and len(entries) < 100:
            requests.post(api_url, data={"value1": "Currently, there is no available papers"})
            return 0
        elif counter == 0 and len(entries) == 100:
            # When there is no available paper and full query
            start = start + 100


if __name__ == "__main__":
    print("Publish")
    # setup =========================================================
    # Set URL of API
    api_url = API_URL
       
    # Load log of published data
    if os.path.exists("published.pkl"):
        ids = pickle.load(open("published.pkl", 'rb'))
    else:
        ids = []
        
    # Query for arXiv API
    query = QUERY

    
    # start =========================================================
    start = 0
    
    # Post greeting to your Slack
    dt = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
    requests.post(api_url, data={"value1": dt})
    
    # Call function
    search_and_send(query, start, ids, api_url)
    
    # Update log of published data
    pickle.dump(ids, open("published.pkl", "wb"))
```


個々の環境で動作させるために、変更が必要になる部分は、コード上部の下記の部分になります。

```koko.py
# webhook POST先URL
API_URL = "https://maker.ifttt.com/trigger/<①IFTTTに設定するイベント名>/with/key/<②IFTTTでの個人用KEY>"

# 検索ワード
QUERY = "(cat:cs.CV)+AND+(abs:depth)"
```
API_URLは、webhook POST先URLを、QUERYはarxivでの検索ワードとなります。
API_URLには、
　①：IFTTTに設定するイベント名
　②：IFTTTでの個人用KEY
を各自で設定する必要があります。

QUERYに関しては、arxiv APIでググると出てきます。現状は、CV分野でアブストの中にdepthと記述してあるものです。


# ④、⑤：IFTTT設定
さっそく設定をしていきます。
前提として、IFTTT登録済みとさせていただきます。
まだの方は、下記のページで登録までやっちゃいましょう。
https://ifttt.com/discover

## Applet作成
My appletsを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/95bfc90a-d244-6dbc-8a6e-1fa83afda21b.png)

New appletをポチ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/bbc6bb40-7c03-3ebb-3df6-bf01815347d2.png)

### Trigger側の設定作成！
Thisをポチ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/ed54a25c-dedd-0fd3-b497-c49aa0d85ed0.png)

webhookを検索し、選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/768b728a-b89a-6399-8545-b092f80e9646.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/7f4ebf1b-7248-7725-00b4-5c6e700445e9.png)

下記の入力ボックスに独自のEvent NameをつけてCreateTriggerをポチります。
ここのEvent Nameが、先ほどのpythonコード中の＜①：IFTTTに設定するイベント名＞となります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/0a7de083-6908-e1ab-7ff2-9195bf4497d3.png)

### Action側の設定作成！
続いて、Action側の設定を行っていきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/b5fd8023-1ce6-e8fa-d4b1-6d70928db291.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/7f413961-0a48-cc2d-e870-47e4b2402e7e.png)

あらかじめ、Lineグループを作成しておくと、そこにPostすることができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/16da2da6-12c4-938b-23ad-6fcb0f6ad289.png)

## IFTTTでの個人用KEY取得
右上のsettings->serviceをポチ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/32aba287-e61e-c7ea-bf73-fd0749fe3181.png)
serviceからwebhookを検索し、ポチる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/68efbeaa-e6eb-e721-c76e-de86be6324a1.png)

右上のsettingsを選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/ce8a277b-5869-0ae4-b037-e5f7fe0239d9.png)

ここの、赤で囲った部分が、IFTTTでの個人用KEYとなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205071/849c2a7b-b09b-ffca-bf95-8ac1d0a29c51.png)

# まとめ
こんな感じで実装することで、簡単にLINEに論文まとめを投稿することができます！

今回、僕はgoogle coraboratoryを使用して、これらを実装をいたしました。
https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja

次の目標は、AWSで定期的実行する、といったところでしょうか。
IFTTTのよい勉強になりました！