dポイントプレゼントキャンペーン実施中!

Web上での必要な情報を全自動で入力してくれるソフトを求めています。その情報はテキストファイルから参照できるとします。ブラウザが表示している入力フォームを自動的に検出し、フォームの項目に応じて自動入力しくれる。店舗名や住所、電話番号、郵便番号などをファイルに書き込んでおくだけで、勝手にブラウザのアクティブウインドウに入力ができるというプログラムを目指しています。
たとえば
#1
郵便番号
住所
氏名
#2
郵便番号
住所
氏名
・・・
と百件ほどあって
それをファイルからブラウザのアクティブウインドウのフォームの入力ボックスに自動で入力すると言うものです。

プログラミング言語は問いませんが・・
できればC言語のwin32apiを使ったものがいいです・・(sdk?
MFCはよくわかりませんが・・
サンプルをいただけるのであればどの言語であっても勉強しようと思っています。

似ているプログラムをあらわしますと
http://www5.ocn.ne.jp/~miisan/aibar/support/
などがあります。
このプログラムと違う点といえば・・
件数が100件ほどであると言う点と
ファイルから入力できないという点と
応用が利くようにカスタマイズできるようにしたいという点です。

どうかよろしくお願いいたします。

A 回答 (1件)

★アドバイス


・つまりは自分でプログラムを組みたい。という事ですね。
 それでどの程度の何が出来る方ですか?
 要望が多すぎます。知りたい質問を限定して。
>その情報はテキストファイルから参照できるとします。
 これは作り手のインターフェイスの問題です。→仕様。
>ブラウザが表示している入力フォームを自動的に検出し、
>フォームの項目に応じて自動入力しくれる。
 HTMLソースを直接解析する必要がありそうです。
 全自動という事は人間と同じ思考をプログラムで行わせるため HTML ソースの項目を
 検索する必要があります。これにより住所、電話番号、郵便番号などの項目に応じた
 データをファイルから読み込み、アクティブ・ウインドウに自動入力すれば良いことになります。
>できればC言語のwin32apiを使ったものがいいです・・(sdk?
 Win32 API なら SendInput() 関数でキー入力、マウス入力をプログラム上で行えます。
 http://msdn.microsoft.com/library/ja/default.asp …
 を参考に。1つの共用体で3つの構造体を使っているので要注意。
>サンプルをいただけるのであればどの言語であっても勉強しようと思っています。
 SendInput() 関数のサンプルはネット検索すると大量に見つかるためここでは省略。
 もしネット検索で分からない場合はアドバイスします。

仕組み:
・すべてを全自動にするのは大変だと思いますので、次のようにしてみるのはどうでしょうか。
 (1)入力する Web ページのアドレス(URL)をプログラムで管理。
 (2)プログラムから入力する Web ページの URL を選択。
 (3)ShellExecute() API関数でブラウザを起動して Web ページを表示。
 (4)Web ページが完全に表示されるまで数秒間だけ待つ。
 (5)(4)で待っている間に URL から HTML ソースを解読して INPUT タグより入力すべき項目を
  検索しておく。これによりフォームに入力する項目の順番をプログラムで把握できる。
 (6)(4)(5)で Web ページが完全に表示され、入力する項目も解読できたら SendInput() 関数で
  順番に項目を入力させる。→キー入力をプログラムでエミュレートするわけ。
 (7)1件目が入力されたら次の項目に移る処理を指定回数分だけ繰り返す。
 全体的な仕組みは上記のようにします。
・注意点としてはフォームの入力場所を特定してフォーカスを合わせる部分が一番重要に
 なると思います。→この辺を手抜き(楽)したい場合は人間が最初に入力場所にフォーカスを
 合わせておく。その後にプログラムから URL を選択します。あとはプログラムでキー入力と
 同じ文字列を SendInput() 関数で転送するだけ。
・なおプログラムで URL を選択する直前のウインドウ・ハンドルを監視してプログラムから
 アクティブ・ウインドウを切り替えるようにします。その後に SendInput() 関数で転送します。

その他:
・ファイルから読み出す部分のインターフェイスや応用が利くカスタマイズを実装するなら
 まずはフォームから入力する Web ページのスタイルを調査することです。
 そしてどんな機能と仕組みにすべきかを考えます。上記のは一般的な方法です。
・あと入力フォームにプログラムから文字列(名前,住所など)を送るサンプルを先に作ります。
 SendInput() 関数を使うことになりますが、あまり早く文字を送ると上手く受け取れないので
 ウエイトを入れたり、次の入力項目に移動するために Tab キーを押された状態をエミュレート
 します。SendInput() 関数の注意点としてはキーが押された、離されたという状態を2つペアで
 転送することになります。また漢字文字は Unicode で指定する必要があります。ここ注意。
 まずはちょっとしたサンプルを作りフォームの自動入力の検証をして下さい。
・以上。

参考文献:
http://msdn.microsoft.com/library/ja/default.asp …
http://msdn.microsoft.com/library/ja/default.asp …
http://msdn.microsoft.com/library/ja/default.asp …
http://msdn.microsoft.com/library/ja/default.asp …
http://msdn.microsoft.com/library/ja/default.asp …

この回答への補足

あれ・・補足つけて更新したはずだったんですが・・
ブラウザを開いてタブキーを押すという操作ができたら
このプログラムができたら後は一気に進みそうなのですが・・
ブラウザを起動してからアクティブウインドウにタブキーを送信することができません・・
ウインドウフォーカスの問題なのか・・Sleepを入れる場所が間違っているのか・・いろいろ試行錯誤してますが・・よくわかりません・・
SendInputは最初よくわからなかったのですが・・いろいろな例を見ながら理解できたつもりで居るだけです・・
#define _WIN32_WINNT (0x0500)
#include <windows.h>
#include <stdio.h>
#include <winuser.h>
#include <Winbase.h>


int WriteClip(char *str);
static VOID FuncSetKeybrd( LPINPUT lpKey, WORD wVKey, BOOL bKeyDown );
static VOID TABKEY( VOID );
void SendKey(unsigned char code);
int
main()
{

ShellExecute(NULL, "open", "http://www.yahoo.co.jp/", NULL, NULL, SW_SHOWMAXIMIZED);
Sleep(500);
TABKEY();
SendKey(VK_TAB);

return 0;


}
int WriteClip(char *str)
{
HGLOBAL hGlobal;
int iLength;
LPSTR lpStr;
int i;
iLength = lstrlen(str);
if (iLength > 1024) iLength = 1024; hGlobal = GlobalAlloc(GHND, iLength + 1);
if (hGlobal == NULL) return -1;
lpStr = (LPSTR)GlobalLock(hGlobal);
for (i = 0; i < iLength; i++)
*lpStr++ = *str++;
GlobalUnlock(hGlobal);
if (OpenClipboard(NULL) == 0)
{
GlobalFree(hGlobal);
return -2;
}
EmptyClipboard();
SetClipboardData(CF_TEXT, hGlobal);
CloseClipboard();
return 0;
}


/* キーの設定用関数 */
static VOID FuncSetKeybrd( LPINPUT lpKey, WORD wVKey, BOOL bKeyDown )
{
lpKey->type = INPUT_KEYBOARD;
lpKey->ki.wVk = wVKey;
lpKey->ki.wScan = (WORD)MapVirtualKey( wVKey, 0 );
lpKey->ki.dwFlags = (bKeyDown ? 0 : KEYEVENTF_KEYUP);
lpKey->ki.dwExtraInfo = 0;
lpKey->ki.time = 0;
}
/* キーボードイベントの送信用関数 */
static VOID TABKEY( VOID )
{
INPUT Key[ 16 ];
LPINPUT lpKey = Key;

SetForegroundWindow(GetForegroundWindow()); // メモ帳のウインドウハンドルを検索&設定
FuncSetKeybrd( lpKey++, VK_TAB, TRUE );
SendInput( (UINT)(lpKey - Key), Key, sizeof(INPUT) );
FuncSetKeybrd( lpKey++, VK_TAB, FALSE );
SendInput( (UINT)(lpKey - Key), Key, sizeof(INPUT) );
}
void SendKey(unsigned char code)
{
EnableWindow(GetForegroundWindow(),TRUE);
SetFocus(GetForegroundWindow());
keybd_event(code,0x00,KEYEVENTF_EXTENDEDKEY|0,0);
keybd_event(code,0x00,KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,0);
}
ソースがごちゃごちゃしてしまっていますがよろしくお願いします。

補足日時:2007/08/28 21:36
    • good
    • 0
この回答へのお礼

結局のところ問題はSleepが短かったみたいです・・・汗

そしてキーボードエミュレートの関数はちゃんと元に戻しておきました。
ありがとうございます。。
データを移す作業はクリップボードに書き込んでペーストしていく形でいこうと思っています。

また機会がありましたら回答よろしくお願いします。
コレにて受付を終了したいと思います。
本当にありがとうございました。

お礼日時:2007/08/28 22:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!