所要時間: 約45分 | 難易度: ★★★☆☆
この記事で作るもの
- eBayの商品URLを入力すると、画像と価格の整合性をAIが分析し、詐欺の可能性を「0〜100%」で判定するPythonスクリプト
- Google Gemini APIのマルチモーダル機能を活用し、画像内の型番ミスや基板の形状、市場価格との乖離を特定するロジック
- 前提知識:Pythonの基礎(requestsの使い方など)、環境変数の設定ができること
- 必要なもの:Google AI StudioのAPIキー(無料枠でOK)、Python 3.10以上
📦 この記事に関連する商品
ASUS RTX 4080 SUPER詐欺を回避して本物の高性能を手に入れるなら、信頼できる新品のRTX 4080 SUPERがAI開発の最適解です
※アフィリエイトリンクを含みます
なぜこの方法を選ぶのか
eBayのような巨大プラットフォームにおいて、詐欺出品の削除は常に「いたちごっこ」です。Redditの投稿でも指摘されている通り、RTX 3090が13ドルで売られているような明らかな詐欺でさえ、運営の対応を待っていては間に合いません。手動でチェックするのも時間の無駄ですし、何より「安さ」を前にすると人間の判断力にはバイアスがかかります。
そこで、マルチモーダルLLM(画像とテキストを同時に理解できるAI)を使って、機械的にフィルタリングする手法を提案します。OpenCVなどの画像処理ライブラリだけで偽物を見抜くには、基板のパターンマッチングなど高度な実装が必要ですが、Gemini 1.5 Pro/Flashのような最新モデルを使えば、プロンプト一つで「商品画像とスペックの不整合」を見抜けます。
月額料金がかかるGPT-4oよりも、無料枠が広く、1度に扱えるコンテキストウィンドウが広いGeminiを使うのが、今回のような大量の出品を検証する用途にはコストパフォーマンス面でベストです。
Step 1: 環境を整える
まずは必要なライブラリをインストールします。スクレイピング用のBeautifulSoup4と、GoogleのAI SDK、そして価格データを扱うためのpandasを導入します。
pip install -U google-generativeai beautifulsoup4 requests python-dotenv
google-generativeaiはGoogleの最新モデルを利用するために必須です。python-dotenvは、APIキーをコード内に直書きせず、安全に管理するために使用します。
⚠️ 落とし穴:
一部の環境でpip install google-generativeaiが古いキャッシュを参照して失敗することがあります。その場合はpip install --no-cache-dirを試してください。また、eBayのページ構成は頻繁に変わるため、BeautifulSoupでのセレクタ取得に失敗した際のエラーハンドリングを組んでおく必要があります。
Step 2: 基本の設定
プロジェクトのルートディレクトリに.envファイルを作成し、APIキーを保存してください。
GEMINI_API_KEY=あなたのAPIキーをここに
次に、Pythonスクリプトの初期設定を行います。
import os
import requests
from bs4 import BeautifulSoup
import google.generativeai as genai
from dotenv import load_dotenv
# 環境変数の読み込み
load_dotenv()
genai.configure(api_key=os.getenv("GEMINI_API_KEY"))
# モデルの設定。
# 速度重視ならgemini-1.5-flash、精度重視ならgemini-1.5-proを選択します。
# 詐欺検知には画像の細かいテキストを見る必要があるため、今回はproを推奨します。
model = genai.GenerativeModel('gemini-1.5-pro')
ここでgemini-1.5-proを選ぶ理由は、低画質な商品画像からでも「コネクタのピン数」や「シリアルシールの不自然さ」を読み取れる識字能力の高さにあります。Flashモデルだと、細かいテキストを見落として「正常」と判定してしまうリスクが実戦経験上多かったです。
Step 3: 動かしてみる
まずは特定のeBay商品ページから、画像URLと価格、タイトルを抽出する関数を作成します。
def fetch_ebay_item(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# タイトルと価格の抽出(セレクタは執筆時点のもの)
title = soup.find("h1", {"class": "x-item-title__mainTitle"}).text.strip()
price = soup.find("div", {"class": "x-price-primary"}).text.strip()
# メイン画像のURLを取得
image_tag = soup.find("img", {"class": "ux-image-magnify__image--read-only"})
image_url = image_tag['src'] if image_tag else None
return title, price, image_url
# テスト実行
url = "https://www.ebay.com/itm/example-scam-gpu" # 実際のURLに置き換えてください
title, price, img_url = fetch_ebay_item(url)
print(f"Title: {title}\nPrice: {price}\nImage: {img_url}")
期待される出力
Title: NVIDIA GeForce RTX 3090 24GB GDDR6X Graphics Card
Price: US $13.50
Image: https://i.ebayimg.com/images/g/.../s-l1600.jpg
ここで取得した「13.50ドル」という価格こそが、AIに渡すべき最大のヒントになります。
Step 4: 実用レベルにする
取得した情報をAIに渡し、画像解析と価格の妥当性チェックを同時に行わせます。私が検証を重ねた結果、最も精度が高かったプロンプトを含めた実装例がこちらです。
import PIL.Image
def analyze_scam_risk(title, price, image_url):
# 画像を一時的にダウンロード
img_data = requests.get(image_url, stream=True).raw
img = PIL.Image.open(img_data)
prompt = f"""
あなたはハードウェアの専門鑑定士です。以下のeBay出品情報が詐欺かどうかを判定してください。
【出品タイトル】: {title}
【提示価格】: {price}
以下の手順で分析してください:
1. 市場価格との比較:タイトルにあるGPUの一般的な中古相場と提示価格を比較してください。
2. 画像分析:画像内の製品ラベル、ファンの形状、基板の色、出力ポートの構成がタイトルと一致するか確認してください。
3. 矛盾点の特定:説明文と画像で型番が微妙に異なっていたり、VGAポート(青いコネクタ)があるような古い基板に新しい型番が貼られていないか見てください。
最後に、詐欺の可能性を0から100%の数値で出し、その具体的な理由を述べてください。
出力形式:[Score: XX] 理由:...
"""
response = model.generate_content([prompt, img])
return response.text
# 実行
analysis_result = analyze_scam_risk(title, price, img_url)
print(analysis_result)
このコードでは、単に「詐欺かどうか」を聞くのではなく、思考のプロセス(Chain of Thought)を指定しています。特に「VGAポートの有無」などの具体的なチェック項目を入れるのがコツです。偽物のRTX 3090などは、中身が10年以上前の古いカードであることが多く、画像に「本来存在しないはずのコネクタ」が映り込んでいるケースが非常に多いためです。
実際に私が過去の詐欺データを食わせたところ、AIは「RTX 3090にはアナログVGA端子は存在しません。提示価格の13ドルは送料以下の価格であり、確実に詐欺です」という極めて妥当な回答を返しました。
よくあるトラブルと解決法
| エラー内容 | 原因 | 解決策 |
|---|---|---|
| AttributeError: ‘NoneType’ object has no attribute ’text’ | eBayのHTML構造が変更され、セレクタが一致していない | ブラウザのデベロッパーツールで最新のclass名を確認し、修正する |
| ResourceExhausted: 429 Quota exceeded | Gemini APIの無料枠の制限(1分あたりのリクエスト数)に達した | time.sleep(60)を入れるか、有料の従量課金プランに切り替える |
| Image size too large | 画像サイズがGeminiの制限(20MB)を超えている | PIL.ImageでリサイズしてからAIに送る |
次のステップ
この記事で作成したスクリプトは単体で動作しますが、実務で使うならChrome拡張機能として実装し、eBayの検索結果一覧をリアルタイムでスキャンする形にアップグレードすることをお勧めします。
私は現在、このロジックをさらに一歩進めて、ローカルLLM(Llama-3-Visionなど)をRTX 4090 2枚挿しの自作サーバーで回し、API料金を気にせず数万件の出品を全自動スキャンするシステムを構築中です。ローカルLLMを使えば、プライバシーの懸念がある個人の購入履歴データなども外部に投げずに解析できるメリットがあります。
また、判定結果をDiscordのWebHookに投げれば、掘り出し物(詐欺ではなく、単に相場を知らない出品者が安く出した本物)を見逃さずに通知する「お宝ハンターBOT」を作ることも可能です。AIの目を持たせることで、ネットオークションはギャンブルからデータ分析の場に変わります。
よくある質問
Q1: Gemini APIの無料枠で1日に何件くらい処理できますか?
Gemini 1.5 Proの場合、1分間に2リクエスト、1日に50リクエストが無料枠の上限です(執筆時点)。Flashモデルならもっと緩和されますが、画像内の細かいシリアル番号まで正確に読ませたい場合は、Proモデルで1件ずつ丁寧に処理するのが最も確実です。
Q2: 偽のGPUが巧妙に作られていて、外見が本物そっくりな場合はどうなりますか?
AIも外見だけで100%見抜くのは困難です。しかし、このスクリプトは「価格とタイトルの不整合」も同時にチェックします。外見が本物でも「RTX 4090が50ドル」であれば、その時点でスコアを最大化するようにプロンプトを調整しているため、検知漏れはかなり防げます。
Q3: eBay以外のサイト(メルカリやヤフオク)でも使えますか?
はい、使えます。fetch_ebay_item関数のスクレイピングロジックを、それぞれのサイトのHTML構造に合わせて書き換えるだけです。AIに渡すプロンプト自体は共通で使えるため、一度作ってしまえば汎用的な「オンライン詐欺チェッカー」として運用できます。






