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

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

新規登録して質問してみよう
ただいま回答率
85.37%
CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

224閲覧

ブラウザ上で動作するPythonのプログラムで、ツイート用文字列の文字数調整が正しく行われない

numin

総合スコア30

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/09/16 11:14

編集2024/09/16 11:29

実現したいこと

PythonのOpenAI・CGIライブラリを使って作成したウェブページで、ChatGPTの返答の文字数を調整してツイートテキストに含めたい。

前提

PythonのOpenAI・CGIライブラリを用いて作成した下記のウェブページで、ChatGPTの返答の文字数を調整してツイート用テキストに含める処理が正しく行われないことがあります。

問題が発生する原因・解決方法をご存知の方がいらっしゃいましたら、ご教示いただければ幸いです。

発生している問題・エラーメッセージ

エラーは発生しておらずツイート用リンクを選択するとポスト作成画面へ問題なく遷移するのですが、本来85文字まで表示されるはずのツイートテキストのうち始めの2文字「1.」しか表示されないことがあります。

なお当初は「1行目から85文字を超えている場合」に発生しているものと考えていたのですが、その後より短い文字数でも発生する場合があることが判明し、問題の発生する状況が解らなくなってしまっている状況です。

※発生頻度は2〜3回に1回、入力されたキャラクター名や結果の文字数に関わらず正しく動作する時・しない時があるようです。

該当のソースコード

Python

1 2#!/usr/local/bin/python3.7 3import openai 4import os 5import sys 6import cgi 7 8print("Content-Type: text/html; charset=utf-8") 9print() 10 11openai.api_key = "xx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 12form = cgi.FieldStorage() 13 14chat = [] 15chat.append({"role": "system", "content": "あなたは名言をリストアップするためのプログラムです。特定の人物/キャラうたーの名言を聞かれると、数字を着けて有名な名言3つを教えてくれます。"}) 16character = form.getvalue("character") 17chat.append({"role": "user", "content": f"{character}の名言を3つ挙げて。なお、返事は行ごとに/を表示して。"}) 18response = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=chat) 19msg = response["choices"][0]["message"]["content"].lstrip() 20lines = msg.split('/') 21line1 = lines[0] # 追加部分1 22tweet = msg 23if len(line1) > 85: 24 tweet = line1[0:85] + '...' # 追加部分2 25elif len(msg) > 85: 26 tweet = msg[0:85] + '...' 27tweet = tweet.split('/') 28 29print(f'<!doctype html>\n<html lang="ja">\n<head>\n<meta charset="UTF-8">\n<meta name="viewport" content="width=device-width,initial-scale=1">\n<title>タイトル</title>\n') 30print('<script>…</script>\n<link rel="stylesheet" href="quotes.css" type="text/css" />\n</head>\n<body>\n<main>\n<h1>タイトル</h1>\n<br><img id="titlepic" src="cgi-bin/xxx.png" width="320" height="240" alt="...">\n') 31print(f'<br>\n<h2>{character}の名言</h2>\n<div>\n<p>') 32for line in lines: 33 print(f'{line}<br>') 34print(f'</p>\n</div>\n<p><a href="https://twitter.com/intent/tweet?related=xxx&text=AIに{character}の名言を教えてもらいました!%0D%0A') 35for t in tweet: 36 print(f'{t}%0D%0A') 37print(f'%0D%0A%20%23タイトル%20by%20%23サイト名%20&url=https://xxx.com/">ツイート(ポスト)する</a></p>\n<br>\n') 38print('</main>\n<footer id="footer-outer">\n</footer>\n') 39print('<script type="text/javascript">\n...\n</script>\n</body>\n</html>') 40

正しく文字数調整されない場合の結果例

※人物/キャラクター名「スヌーピー」で実行した時:

1. "愛は、二人で一つのベッドで寝ても、一緒に目を覚ましても、いっしょに笑い合うことだよ。" 2. "幸せとは、人に認められていることではない。自分が大切に思っていることを持っていることだ。" 3. "明日のことを考えすぎるな、今日を楽しめばいいんだ。"

試したこと

始めは「1行目の文字数がすでに85文字を超えていること」が原因とばかり考えていたので、上記ソースコードの「追加部分」というコメントの通り、「返答全体が85文字より多ければ」という条件のまえに「1行目の文字数が85文字より多ければ」という条件を追加してみましたが、状況に変わりはありませんでした。

補足情報(FW/ツールのバージョンなど)

※使用しているレンタルサーバの事情により古いバージョンのOpenAIライブラリを使用していますが、ウェブページ上には正しく返答が表示されることから、プログラムへの影響はないものと考えております。

以上です。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

スヌーピーの例では3文字目にダブルクォーテーションがあるので、ソースの36行目でその内容をそのままURLパラメーターに追加すると、34行目の<a href="ではじまるhrefをダブルクォーテーションで閉じてしまいます。

つまり、href="https://twitter.com/intent/tweet?related=xxx&text=AIにスヌーピーの名言を教えてもらいました!%0D%0A1. "と、閉じるダブルクォーテーションが出現したところでhrefの指定が終わってしまうのです。そのため、「1.」だけで終わってしまうのではないかと思います。

ChatGPTの回答は実行の度に揺れますので、ダブルクォーテーションが含まれない回答の場合は良いかもしれませんが、そうではない時は切れてしまうのでしょう。

URLでは英数字や一部の記号以外は本来は使えませんので、urllib.parse.quote()などでURLエンコードしてから指定するのが良いかと思います。

投稿2024/09/16 12:47

編集2024/09/16 12:49
segavvy

総合スコア1034

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

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

numin

2024/09/16 13:05

ご丁寧に解説していただき、ありがとうございます。 おっしゃる通り、検証してみたところ問題の発生時には必ず3文字目にダブルクオーテーションが出力されてしまっていました。 初歩的なミスをしてしまっていたようで、失礼いたしました。 ご提案いただきました通り、一度URLエンコードしてから渡すように調整してみたいと思います。 ありがとうございました。
segavvy

2024/09/16 13:11

いえいえ、お役に立てたようでよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問