質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

408閲覧

golangでのlinebot上でスクレイピングした結果が返ってこない

seven77

総合スコア13

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2017/12/27 09:21

編集2017/12/27 13:15

linebot-sdk-goとgoqueryを用いて、スクレイピングした結果を特定のワードの返答として返したいのですが、linebotで表示されません。
herokuで行っているのですが、リクエストは届いているみたいです。

以下はコードです。

go

1for _, event := range events { 2 if event.Type == linebot.EventTypeMessage { 3 switch msg := event.Message.(type) { 4 case *linebot.TextMessage: 5 if msg.Text == "test"{ 6 bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage("success")).Do() 7 }else if msg.Text == "now" { 8 n := time.Now() 9 NowT := timeutil.Strftime(&n,"%Y年%m月%d日%H時%M分%S秒") 10 bot.ReplyMessage(event.ReplyToken,linebot.NewTextMessage(NowT)).Do() 11 }else if msg.Text == "disney"{ 12 doc, err := goquery.NewDocument("http://disneyreal.asumirai.info/realtime/disneyland-wait-today.html") 13 if err != nil { 14 log.Fatal(err) 15 } 16 test := doc.Find(".wait-time #WL_BTMOUNTAIN .area .time p").Text() 17 _, err = bot.ReplyMessage(event.ReplyToken,linebot.NewTextMessage(test)).Do() 18 if err != nil { 19 log.Fatal(err) 20 } 21 } 22 } 23 } 24 }

disneyに対する応答でのherokuのlogは以下のようになりました。

2017-12-27T13:09:37.740726+00:00 app[web.1]: 2017/12/27 13:09:37 linebot: APIError 400 The request body has 1 error(s) 2017-12-27T13:09:37.740741+00:00 app[web.1]: [messages[0].text] May not be empty 2017-12-27T13:09:43.499233+00:00 heroku[web.1]: State changed from starting to up 2017-12-27T13:09:37.745937+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=POST path="/callback"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mattn

2017/12/27 09:23

これだけではどこまで通ったか分かりません。heroku のログを確認したり log をもう少し足してどこまで処理が進んだのか確認して下さい。
mattn

2017/12/27 09:29

あともう1点、bot.ReplyMessage(event.ReplyToken,linebot.NewTextMessage(test)).Do() でエラーが返っているかもしれないのでログに出力するなどした方が良いです。
seven77

2017/12/27 09:37

bot.ReplyMessage(event.ReplyToken,linebot.NewTextMessage(test)).Do()でのエラーをログに出力の仕方がわからないのですが、教えていただけると助かります
seven77

2017/12/27 13:15

ありがとうございます!err内容はでたのでかくにんしてみます
guest

回答1

0

ベストアンサー

line-bot-sdk-go のテストコード を見る限りですが、送っている text が空文字列の様です。scraping が失敗しているのではないでしょうか。

ちなみに軽く HTML を見た感じ、selector は以下の間違いではないでしょうか?

go

1test := doc.Find("#WL_BTMOUNTAIN .area p").Text()

投稿2017/12/27 14:56

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seven77

2017/12/28 01:24

回答ありがとうございます。 指摘されたコードで直しましたが同様のエラーが発生しました。 linebotのコードでない場合、以下の所はうまくいきました。 ``` doc, err := goquery.NewDocument("http://disneyreal.asumirai.info/realtime/disneyland-wait-today.html") if err != nil { log.Fatal(err) } test := doc.Find(".wait-time #WL_BTMOUNTAIN .area .time p").Text() ```
mattn

2017/12/28 03:30

いえ、 .time は要りません。
seven77

2017/12/28 05:04

.timeを抜いてやったところ、同様のエラーが発生してうまく行きませんでした。 ``` doc, err := goquery.NewDocument("http://disneyreal.asumirai.info/realtime/disneyland-wait-today.html") if err != nil { log.Fatal(err) } test := doc.Find(".wait-time #WL_BTMOUNTAIN .area .time p").Text() ``` だけで他のgoファイルでやるとうまくいきます。 ``` for _, event := range events { if event.Type == linebot.EventTypeMessage { switch msg := event.Message.(type) { case *linebot.TextMessage: if msg.Text == "test" { bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage("success")).Do() } else if msg.Text == "now" { n := time.Now() NowT := timeutil.Strftime(&n, "%Y年%m月%d日%H時%M分%S秒") bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(NowT)).Do() } else if msg.Text == "disney" { doc, err := goquery.NewDocument("http://disneyreal.asumirai.info/realtime/disneyland-wait-today.html") if err != nil { log.Fatal(err) } test := doc.Find("#WL_BTMOUNTAIN .area p").Text() _, err = bot.ReplyMessage(event.ReplyToken, linebot.NewTextMessage(test)).Do() if err != nil { log.Fatal(err) } } } } } ``` 上記だとうまくいきませんでした。
mattn

2017/12/28 05:22

閉園後は .time ノードが無くなるようですね。
seven77

2017/12/28 06:01

.timeノードをなくしてエラーを見ても同様で、空文字となってしまいます。 ``` ``` package main import ( "fmt" "github.com/PuerkitoBio/goquery" ) func main() { doc, err := goquery.NewDocument("http://disneyreal.asumirai.info/realtime/disneyland-wait-today.html") if err != nil { fmt.Println(err.Error()) } wait := doc.Find("#WL_BTMOUNTAIN .area p").Text() fmt.Println(wait) } ``` 実行すると、今だと以下のように返ってきます ``` 運営中発券終了100 分待ち ```
seven77

2017/12/28 06:01

LINEbotのほうだとうまくいきませんでした。
mattn

2017/12/28 06:20

ディズニーのページが heroku などのサーバを拒否している可能性はあります。bot のアクセスが多くて困っているサイトなどはそういう対応をする場合もあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問