6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

初心者がAWS Lambda + Python + LINE BotでWikipediaのタイトルをランダム送信

Last updated at Posted at 2021-08-12

本記事は「いのべこ 夏休みアドベントカレンダー 2021」の13日目の記事です。記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません(お約束)。

はじめに

入社から1年半が経ったが、研修修了後から全くプログラミングを触らなくなってしまった。
さすがに危機感を感じた私はここで行動に移さなければという使命感から今回このような記事を書くことにした。

プロフィール

  • 社会人2年目
  • プログラミング経験ほぼなし(研修でやったことはほぼ忘れた)
  • 経営学士
  • サッカーやってました(幼稚園~大学)
  • 最近とろろが好きになってきた

技術経験

入社からアプリ開発はほぼなく、データベースの構築やOSSの構築などの環境構築作業をメインで行っていた。そのためコーディングの経験や知識が不足しており、まじ半端ねーやべーレベルでできない。(型はstringとintしか知らないレベル)

作るもの

iOS の画像 (1).png

それではようやく本題に入ろうと思う。
どこに需要があるんだよと思うかもしれないが、適当な言葉を入力するとランダムでWikipediaからタイトルとURLを持ってきて5個教えてくれるbotだ。まあ気になるタイトルあったら調べるんじゃねっていう軽い気持ちで作ったので需要とかは今回はなしでお願いしたい。

使用技術

  • Python3系
  • AWS Lambda
  • LINE Messaging API
  • WikipediaのAPI(?)

開発手順

Wikipediaからランダムのタイトルを持ってくる

なんかわからんけどこのAPIでランダムなタイトル持ってこれるらしい。

ということでこれを使ってタイトル持ってくることにした。

import requests

url = "http://ja.wikipedia.org/w/api.php?format=json&action=query&list=random&rnnamespace=0&rnlimit=10"

r = requests.get(url)

rval = r.json()

text = ""
n = 1

for jsn_val in rval["query"]["random"]:
    if n < 10:
        text += jsn_val["title"] + "\n"
    else :
        text += jsn_val["title"]
    n += 1


print(text)

上記を実行した結果が以下だ。

$ python main.py
大田紳一郎        
早太郎温泉        
山口将吉郎        
下大静脈
定
和田春生
半田市立乙川中学校
コミック・モエ    
口呼吸
吉村和之

ちなみにここに来るまでに2、3時間かかってしまった。
一つ一つの処理を理解するのに時間がかかってしまった、、、

LINE Developersの登録

今回は以下のサイトを参考に登録を行った。

特に難しいこともなかったし、登録するだけだった。

Lambdaの関数を作成

ここに関しても上記のサイトと同じものを参考にし、まずはオウム返しをする仕組みを作ってみた。
iOS の画像 (2).png

とりあえずそのまま貼り付けて完成。

この仕組みを活かして今回作りたいWikipediaからの情報を持ってくるように変更していく。

import json
import urllib.request
import requests

def get_title():
    uri_tmp = "https://ja.wikipedia.org/wiki/"
    url = "http://ja.wikipedia.org/w/api.php?format=json&action=query&list=random&rnnamespace=0&rnlimit=5"

    r = requests.get(url)

    rval = r.json()

    msg_json_list = []
    
    for jsn_val in rval["query"]["random"]:
        uri = uri_tmp + jsn_val["title"]
        msg_json = {
            "type": "text",
            "text": jsn_val["title"] + '\n' + uri
            }
        msg_json_list.append(msg_json)
    
    print(msg_json_list)
    
    return msg_json_list

def lambda_handler(event, context):
    msg_title_json = get_title()
    for message_event in json.loads(event['body'])['events']:
        url = 'https://api.line.me/v2/bot/message/reply'
        headers = {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + "hogehoge"
        }
        body = {
            'replyToken': message_event['replyToken'],
            'messages': msg_title_json
        }

        req = urllib.request.Request(url, data=json.dumps(body).encode('utf-8'), method='POST', headers=headers)
        with urllib.request.urlopen(req) as res:
            logger.info(res.read().decode("utf-8"))


    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

何とか完成!
LINEで適当な文字を送ったら、、、
iOS の画像.png
返ってきた!
無事に完成しました!

感想

今回作ったLINE botは全く持って需要がないということが分かったとともに、プログラミングおもろくねという感情が沸き上がった。今回は会社でのイベントでこういったことを行ったが、プライベートでもやりたいということで、次回はスロット台作ってみたという投稿をする。お楽しみに!

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?