生成AI(ChatGPT, Gemini, Copilot)で簡単なプログラミングしてみた
February 16, 2025 – 3:28 pm生成AIなるもので、どの程度プログラミングできるのか試してみた。
生成AIと呼ばれるもののうち、ChatGPT(2.0 Flash), Gemini, CoPilotでプログラミングをし、実際に動作できるかどうか確かめることにした。日々進歩する生成AIではあるが、ここで使うのは現時点(2025/2/15)で私のWindows環境上で「無料で」使うことができるAIツールにより試してみた。
課題として、「Node(Javascript)でxにテキストと動画をtweetするサンプルプログラムを作成する」というものにした。なお、すでにX-Apiを使用するのに必要なAPIキーとシークレットなどはすでに取得しており、それを使うことにした。
質問は3つの生成AIに対して共通で以下:
node(JavaScript)で x(旧twitter)にtextと動画などをtweetすることは可能ですか?可能でしたらサンプルが知りたいのですが
まず、Geminiによる返答とサンプルコード:
はい、Node.jsでX(旧Twitter)にテキストと動画などをツイートすることは可能です。
必要な準備
- X Developer Portalへの登録: X APIを利用するためには、X Developer Portalに登録し、プロジェクトを作成する必要があります。
- APIキーとシークレットの取得: プロジェクト作成後、APIキー、APIシークレット、アクセストークン、アクセストークンシークレットを取得します。これらの情報は、ツイートを投稿する際に必要となります。
- 必要なnpmパッケージのインストール: twitter-api-v2などのX APIを操作するためのnpmパッケージをインストールします。
サンプルコード
以下は、Node.jsでXにテキストと動画をツイートするサンプルコードです。onst { TwitterApi } = require('twitter-api-v2'); // APIキー、APIシークレット、アクセストークン、アクセストークンシークレットを設定 const client = new TwitterApi({ appKey: 'YOUR_API_KEY', appSecret: 'YOUR_API_SECRET', accessToken: 'YOUR_ACCESS_TOKEN', accessSecret: 'YOUR_ACCESS_TOKEN_SECRET', }); async function tweetWithVideo() { try { // メディアをアップロード const mediaId = await client.v1.uploadMedia('./path/to/your/video.mp4', { media_type: 'video/mp4', mime_type: 'video/mp4', }); // ツイートを投稿 await client.v2.tweet({ text: 'テキスト', media: { media_ids: [mediaId] }, }); console.log('ツイートが投稿されました'); } catch (error) { console.error('エラー:', error); } } tweetWithVideo();
ここで示されたサンプルコードをcopy/pastし、jupyterlab上で動作(APIキーは取得済みのもの)させると、なんの修正もなくtweet成功。
以下、tweet結果:
test for gemini pic.twitter.com/Rn4kOiGZun
— Yamasnet (@Yamasnet) February 16, 2025
次に Windows11上のCopilotの返答:
Geminiの場合と同じような準備(ここでは省略)
サンプルコード:
const { TwitterApi } = require('twitter-api-v2'); const fs = require('fs'); // XのAPIキーとシークレット const client = new TwitterApi({ appKey: 'YOUR_API_KEY', appSecret: 'YOUR_API_SECRET', accessToken: 'YOUR_ACCESS_TOKEN', accessSecret: 'YOUR_ACCESS_TOKEN_SECRET', }); // ツイートするメッセージ const tweet = 'Hello, world with a video!'; // 動画ファイルのパス const videoPath = 'path/to/your/video.mp4'; async function postTweet() { try { // 動画をアップロードする const mediaId = await client.v1.uploadMedia(videoPath); // テキストと動画付きのツイートを投稿する const response = await client.v1.tweet(tweet, { media_ids: mediaId }); console.log('ツイートが正常に投稿されました:', response); } catch (error) { console.error('ツイートの投稿に失敗しました:', error); } } postTweet();
結果は、次のエラーメッセージを出力し成功せず:
ツイートの投稿に失敗しました: ApiResponseError: Request failed with code 403 - You currently have access to a subset of X API V2 endpoints and limited v1.1 endpoints (e.g. media post, oauth) only. If you need access to this endpoint, you may need a different access level. You can learn more here: https://developer.x.com/en/portal/product (Twitter code 453)
エラーメッセージを入力し、尋ねると、const response = ..の部分を新しい関数uploadVideo()を作り、以下に差し替えることが提案される:
async function uploadVideo() { const { media_id_string } = await client.v1.uploadMedia(videoPath, { type: 'video/mp4' }); return media_id_string; } const response = await client.v2.tweet(tweet, { media: { media_ids: [mediaId] } });
改良案においては、以下のエラーを吐き出す:
[twitter-api-v2] Deprecation warning: In TwitterApiv1ReadWrite.uploadMedia() call, you're using options.type. Remove options.type argument and migrate to options.mimeType which takes the real MIME type. If you're using type=longmp4, add options.longVideo alongside of mimeType=EUploadMimeType.Mp4. To disable this message, import variable TwitterApiV2Settings from twitter-api-v2 and set TwitterApiV2Settings.deprecationWarnings to false. ツイートの投稿に失敗しました: ApiResponseError: Request failed with code 400 - Invalid Request: One or more parameters to your request was invalid.
このエラーメッセージを伝えると、以下の返答と修正案が示される:
このエラーは、twitter-api-v2ライブラリのアップデートに伴う警告と、APIリクエストが無効であることを示しています。具体的には、options.typeの代わりにoptions.mimeTypeを使用する必要があります。 動画のアップロードについて、以下の修正を行います: options.typeをoptions.mimeTypeに変更します。 長い動画の場合は、options.longVideoも指定します。
ここで以下のように、uploadVideo関数の内容を以下のように修正するコードが提案:
async function uploadVideo() { const mediaId = await client.v1.uploadMedia(videoPath, { mimeType: EUploadMimeType.Mp4, longVideo: true }); return mediaId; }
またも次のエラー:
ツイートの投稿に失敗しました: ReferenceError: EUploadMimeType is not defined
このエラーを評価し、以下のように対応策を提案:
EUploadMimeTypeが定義されていないというエラーが発生していますね。このエラーの原因は、twitter-api-v2ライブラリのバージョンや使用方法に関連している可能性があります。 まず、memeTypeを直接指定する方法を試してみましょう。
として、以下のように、uploadVideo関数の修正コードを提案:
async function uploadVideo() { const mediaId = await client.v1.uploadMedia(videoPath, { mimeType: 'video/mp4', media_category: 'tweet_video' // 動画をアップロードする場合に指定 }); return mediaId; }
これでtweetすることに成功。x上にて、geminiの場合と同じものがアップされているのを確認。
最後にChatGPTの場合:
こちらでは、twitライブラリを用いた回答で、以下のサンプルプログラムが提案(twitパッケージのnpmインストールを前提に):
const Twit = require('twit'); const T = new Twit({ consumer_key: 'あなたのconsumer_key', consumer_secret: 'あなたのconsumer_secret', access_token: 'あなたのaccess_token', access_token_secret: 'あなたのaccess_token_secret', }); const fs = require('fs'); // 画像ファイルのパス const imagePath = 'path/to/your/image.jpg'; // 画像をTwitterにアップロード T.post('media/upload', { media: fs.readFileSync(imagePath) }, function (err, data, response) { if (err) { console.error('画像アップロードエラー:', err); return; } // アップロードした画像のmedia_idを取得 const mediaId = data.media_id_string; // ツイートのテキスト const status = 'ここにツイートするテキストを書きます'; // 画像とテキストをツイート const tweet = { status: status, media_ids: [mediaId], // 画像IDを指定 }; T.post('statuses/update', tweet, function (err, data, response) { if (err) { console.error('ツイートエラー:', err); } else { console.log('ツイート成功:', data.text); } }); });
これを実行すると、メディアを動画 mp4にする場合と 静止画jpgについてそれぞれ以下のエラー:
#動画 .mp4の場合 RangeError: Maximum call stack size exceeded #静止画 .jpgの場合 画像アップロードエラー: Error: Could not authenticate you
エラーで問い合わせしようとしたが、返答してくれなかった。
使用後の感想:
AIでプログラムが作成できるという話をよく聞くので試してみた。
無料でだれもがアクセスできる生成AIを使ってためしてみたが、通常のWindowsマシン上で特別なことをしないでもそれなりのことができるのがわかった。
なかでも、GoolgeのGeminiは一発で動作可能なコードを提案してきた。これはすごい。
Windows11のCopilotも、エラーを伝えると、「わかる範囲で」努力しながら、動作可能なコードを示すのには感心。よくがんばったとの印象。
最後のChatGPTについては、動作できるものはできなかった。使ってみたバージョンがよくなかったかもしれない。
結論とすると、QUDAなんてのを使う本格的なAIでなくても、プログラミング程度には十分使えるのではと考えた。完璧なプログラミングはできないまでも、使用可能なツール、計算パッケージなどを引き出すことは簡単にできる。
どんどん使おう!