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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

5394閲覧

Python 3.5でのHTTPリクエストについて

I_am_4a

総合スコア21

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2017/12/19 12:14

編集2017/12/19 22:09

Python 3.5でのHTTPリクエストについて

WebhookにPOSTメソッドでリクエストを送るコードを実装している最中にエラーが発生しました。

Text

1Traceback (most recent call last): 2 File "C:\Users***\AppData\Local\Programs\Python\Python35-32\lib\urllib\parse.py", line 779, in urlencode 3 raise TypeError 4TypeError 5 6During handling of the above exception, another exception occurred: 7 8Traceback (most recent call last): 9 File "gt3.py", line 60, in <module> 10 data = urllib.parse.urlencode(data).encode('ascii') 11 File "C:\Users***\AppData\Local\Programs\Python\Python35-32\lib\urllib\parse.py", line 787, in urlencode 12 "or mapping object").with_traceback(tb) 13 File "C:\Users***\AppData\Local\Programs\Python\Python35-32\lib\urllib\parse.py", line 779, in urlencode 14 raise TypeError 15TypeError: not a valid non-string sequence or mapping object

様々なブログを見て回って書いたコードが原因だと思われるのですが、いまいちよくわかりません。

Python

1# -*- coding:utf-8 -*- 2 3from twitter import * 4import sys 5import urllib 6import urllib.request, urllib.parse 7import demjson 8import os 9sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir)) 10 11from discordWebhooks import Webhook, Attachment, Field 12 13arg = sys.argv 14 15# Some Programs... 16 17url = "https://discordapp.com/api/webhooks/*****/*****" 18method = "POST" 19headers = {"Content-Type": "application/json"} 20data = {"content": text} 21data = demjson.encode(data) 22data = urllib.parse.urlencode(data).encode('ascii') 23 24req = urllib.request.Request(url, data=data, method=method, headers=headers) 25with urllib.request.urlopen(req) as res: 26 print(res.read().decode("utf-8"))

エラーログを見る限り、エンコード部分で失敗していると思うのですが、解決方法がわかりません。
どうすればいいでしょうか。
回答よろしくお願いいたします。

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

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

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

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

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

umyu

2017/12/19 15:52

requestsパッケージではなくurllibを使わないといけない理由は特にありますかー?
I_am_4a

2017/12/19 22:07

「urllibを使わないといけない」というわけではないです。
guest

回答1

0

ベストアンサー

以下のjsonのパース処理を

import demjson data = {"content": text} data = demjson.encode(data) data = urllib.parse.urlencode(data).encode('ascii')

以下のように書き換えれば、それ自体は成功するかと思います。
従来処理も、asciiエンコードしたjsonをurllib.request.Requestに渡そうとしているので、
おそらく等価な処理になるかと。(requestの実行までは手元で試していません)
(demjsonは使っているのを見たことがありませんでした。
jsonモジュールは標準で使えてhttpリクエストの対応には必要十分なので、個人的にはそちらを推奨します。)

import json data = {"content": text} data = json.dumps(data)

解決方法がわからない、とのことでしたが、
そういったときは、最初に書いた自身のコードがなぜエラーになったかを確認するため、
まずソース/docsを読んでください。

"python urllib.parse.urlencode docs"などと検索すると、
どういった関数で、引数に何を想定していて、返り値が何かがわかります。
もしくは統合開発環境(Pycharmなど)を使用しているなら、その機能でソースを辿っても良いかと。
その上で扱い方がわからないときは、ターミナルから"python"コマンドを実行し、
その上で、上記のような短いテストコードを走らせると理解が捗ると思います。
あとは、コピペした内容に従うことが目的ではないはずなので、
手間に思えても、"python json encode"などと検索するとすぐに定番の代替案が出てきたりします。

投稿2017/12/20 01:15

naosk8

総合スコア86

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

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

I_am_4a

2017/12/21 13:10 編集

そうですね…詳しくドキュメントを読んでいなかったのが失敗の要因かな…と。 >> jsonモジュールは標準で使えてhttpリクエストの対応には必要十分なので、個人的にはそちらを推奨します。 私の環境ではなぜかエラーログを出すので使っていませんでした。こっちのほうが見る限り明らかに楽なので、モジュールの確認などしておきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問