レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。
ヒッキープログラミングスレ
プログラミングの話題のスレ
質問・相談
初心者からプロまで
プログラミングに関することなら何でもOK
PHP使える無料鯖を探して2ch規制を突破したい
サンプルコードが無いと
マニュアルとかAPI一覧見ても使い方が分からん
>>83
80ポートが空いてると無理だよ
な、なんだってーっ!?
つまり、このクッキー処理を突破した次でエラーを返されるってことか・・・
うお!マジか、このエラーがそうなのか?
ERROR:変なホスト規制中!! 変なホストです。
http://sv2ch.baila6.jp/chk_proxy3.cgi
でチェックしたら焼かれてたw
俺の努力はいったい・・・orz
ひ、ひとまずだ、2chとのやりとりのノウハウの一部を覚えられたってことで
普通のGUIアプリで2ch専用ブラウザを作れる土台の一部になったってことで
VB.NETかC#かJavaか
ライブラリは豊富だし、さっきのPHPスクリプト量と大差ないだろう
たぶん出来る!
GUIの作りやすさからしてVB.NETかVC#か
Java使ってCUIの専用ブラウザでも作ってみるか
JavaによるHTTPリクエスト時のパラメータの渡し方
ttp://www.dd.e-mansion.com/~kumada/laboratory/column/java_post.html
簡単そう
Javaなげえ、ひとまずここでひといき
String server = "ikura.2ch.net";
Hashtable<String, String> data = new Hashtable<String, String>();
Hashtable<String, String> header = new Hashtable<String, String>();
data.put("bbs", "hikky");
data.put("key", "1362050172");
data.put("time", Long.toString(System.currentTimeMillis() - 2000));
try {
data.put("FROM", URLEncoder.encode("(-_-)さん", "Shift_JIS"));
data.put("mail", URLEncoder.encode("sage", "Shift_JIS"));
data.put("MESSAGE", URLEncoder.encode("テストだよ", "Shift_JIS"));
data.put("submit", URLEncoder.encode("書き込む", "Shift_JIS"));
} catch (Exception e) {
System.err.println(e);
}
header.put("Host", server);
header.put("Accept", "*/*");
header.put("Referer", "http://"+server+"/test/read.cgi/"
+data.get("bbs")+"/"+data.get("key")+"/");
header.put("Accept-Language", "ja");
header.put("User-Agent", "Monazilla/1.00 (monaweb/1.00)");
header.put("Connection", "close");
//確認
System.out.println("data");
for (Enumeration<String> e = data.keys(); e.hasMoreElements();) {
String k = e.nextElement();
System.out.println("key="+k);
System.out.println("value="+data.get(k));
}
System.out.println("header");
for (Iterator<Map.Entry<String, String>> i = header.entrySet().iterator(); i.hasNext();) {
Map.Entry<String, String> k = i.next();
System.out.println("key="+k.getKey());
System.out.println("value="+k.getValue());
}
Enumeration と Iterator はどっちのほうが使いいいのだろうか
entrySet より keySet のほうがややスマートだったか
entrySet()だと値の書き換えメソッドが存在するのか
まぁkeySet()だろうがkeys()だろうがキー名ありゃ値の変更なんて難しくないがな・・・
さて、データの準備ができたから次は初回書き込みのPOSTだ
Content-Length: はやはり自動で設定してくれんのかな?バッファ書き出してclose()したときに自動設定されんのかな?
PHPがいかに楽か分かるは
そういや、書き込みテストのスレを探さないとな・・・規制中でも書き込める板がいくつかあったはずだな
Iteratorのほうが新しくてこっちが推奨なのか・・・だとすると記述量からしてentrySet()よりkeySet()のほうが記述量が減って楽そうだが・・・
HashtableよりもHashMapのほうが新しいのかHashMap使ったほうがいいのかな
なるほど、Iteratorを使ったほうが削除等が安全に行えるってわけね、でも削除する予定は無いけど・・・うーん
HashtableとHashMapの違いはnull値と同期か、Hashtableは同期処理を内包しててパフォーマンスがやや悪なのか
ネットに転がってるJavaの日本語参考文献がどれも古すぎだわ
< >でくくる、型パラメータ(?)とかいうのが書かれてない古いコード大杉
Java初心者たちには難易度高杉だろ
ひとまずPOST通信を記述する前にHashMapとIteratorに書き換えるは
HashtableをHashMapに置き換えて
確認のをheaderのをコピペでheaderをdataに置き換えるだけで簡単に終わったはw
OK,通信はこれでOK
String post = "";
for (Iterator<Map.Entry<String, String>> i = data.entrySet().iterator(); i.hasNext();) {
Map.Entry<String, String> e = i.next();
post += "&" + e.getKey() + "=" + e.getValue();
}
post = post.substring(1);
System.out.println("post="+post);
try {
URL url = new URL("http://"+server+"/test/bbs.cgi");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
for (Iterator<Map.Entry<String, String>> i = header.entrySet().iterator(); i.hasNext();) {
Map.Entry<String, String> e = i.next();
connection.setRequestProperty(e.getKey(), e.getValue());
}
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
PrintWriter printWriter = new PrintWriter(connection.getOutputStream());
printWriter.print(post);
printWriter.close();
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("Shift_JIS")));
String str;
while ( null != ( str = bufferReader.readLine() ) ) {
System.out.println(str);
}
bufferReader.close();
connection.disconnect();
} catch (Exception e) {
System.err.println(e);
}
getRequestProperties()かgetHeaderFields()でSetCookieの情報を取得すりゃいいのかな?
クッキーはHttpCookieクラス使えばええのんかな
リクエストプロパティはこちらから送るほうでヘッダフィールドが向こうからのレスポンスかな?それぞれ出力して確認してみるか
>>95
ここのPOST通信のコード、スペルミスがあったから気を付けてねん
なるほど、クッキーは他のJavaアプリと共有くさいな・・・やっかいや
CookieManagerというクラスがあるのか、こっち使うべきなのか?
なるほどHttpURLConnectionがCookieHandlerを使うからデフォルトのCookieHandlerをCookieManagerで作ると
クッキーデータを管理するにはCookieStoreの実装を自前で用意せにゃならんのか・・・面倒だな、今んとこはJavaさんに一括管理してもらうか
クッキーを見れたどおお
String post = "";
for (Iterator<Map.Entry<String, String>> i = data.entrySet().iterator(); i.hasNext();) {
Map.Entry<String, String> e = i.next();
post += "&" + e.getKey() + "=" + e.getValue();
}
post = post.substring(1);
CookieManager cm = new CookieManager(); //クッキーの準備
CookieHandler.setDefault(cm);
String httpSource = "";
try {
URL url = new URL("http://"+server+"/test/bbs.cgi");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
for (Iterator<Map.Entry<String, String>> i = header.entrySet().iterator(); i.hasNext();) {
Map.Entry<String, String> e = i.next();
connection.setRequestProperty(e.getKey(), e.getValue());
}
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
PrintWriter printWriter = new PrintWriter(connection.getOutputStream());
printWriter.print(post);
printWriter.close();
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("Shift_JIS")));
String str;
while ( null != ( str = bufferReader.readLine() ) ) {
httpSource += str;
}
bufferReader.close();
connection.disconnect();
} catch (Exception e) {
System.err.println(e);
}
//クッキーチェック
System.out.println(httpSource);
for (Iterator<HttpCookie> i = cm.getCookieStore().getCookies().iterator(); i.hasNext();) {
HttpCookie hc = i.next();
System.out.println(hc);
}
さすがにCookieStoreの自前実装は面倒すぎるなあ・・・でもこれクリアしないと他のJavaアプリとクッキー共有くさいしなあ・・・
ひとまずクッキーは自動保存されるぽいし
書き込みの成功の可否をチェックするためhttpSourceをDOMに突っ込むという段階に行きますか
次はJavaのDOMをググって調べますか・・・
Meryダメだな
インデントの設定がgPadに劣るか
ただgPadだと背景が黒になるのがなあ・・・変えるの面倒だし
Meryのお気に入りのプラグインも微妙だし
DocumentBuilderFactoryはスレッドセーフじゃないってあぶねえな
XML Schemaねぇ・・・
おまえらはプログラミングで何作るん?どのプログラミング言語習得中なの?
どうしてJaveでCookieが取得できないんだろう?(1): Javaでアプリケーション作りたい
ttp://tomott.cocolog-nifty.com/blog/2010/08/javecookie1-87d.html
なるほど、デフォルトのクッキーマネージャはメモリ上にクッキー情報を保管するのか他のJavaアプリと共有ってわけじゃないのね
クッキーストアを取得してクッキー情報を読み書きでファイル保存読込が楽そうなんだけど
普通はやっぱりクッキーストアを自分で作るのが普通なのかね・・・まぁ大半の処理をスーパークラスに投げちゃえば簡単だろうけど
つチラ裏
お堅いこといいなさんな
コテつけてNGしやすくするから許してちょんまげ
コテつけたお
ひとまず自前でCookieStoreを実装してみっか、てか全部superクラスの呼び出すだけのだけどw
addメソッドとremoveメソッドのとこにSystem.out.println("cookie add");とか入れてどのタイミングで呼び出されてるかチェキラ!
ん・・・?
ほぎゃああああああああ!CookieStoreってインターフェースかよ・・・全部自己実装が必要ジャマイカ・・・
一応でけた
public class MyCookieStore implements CookieStore {
HashSet<URI> uris = new HashSet<URI>();
HashMap<String, HttpCookie> cookies = new HashMap<String, HttpCookie>();
File cookiedir = null;
File uridir = null;
public MyCookieStore() {
System.out.println("MyCookieStore.Constractor");
this.cookiedir = new File(System.getProperty("user.dir"), "cookie");
if (this.cookiedir.exists() == false) this.cookiedir.mkdir();
try {
File[] files = this.cookiedir.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println("cookie["+i+"]="+files[i]);
BufferedReader reader = new BufferedReader(new FileReader(files[i]));
this.cookies.put(files[i].getName(), new HttpCookie(files[i].getName(), reader.readLine()));
reader.close();
}
this.uridir = new File(System.getProperty("user.dir"), "uri");
if (this.uridir.exists() == false) this.uridir.mkdir();
files = this.uridir.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println("uri["+i+"]="+files[i]);
BufferedReader reader = new BufferedReader(new FileReader(files[i]));
this.uris.add(new URI(reader.readLine()));
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void add(URI uri, HttpCookie cookie) {
System.out.println("MyCookieStore.add("+uri+", "+cookie+")");
try {
this.cookies.put(cookie.getName(), cookie);
PrintWriter writer = new PrintWriter(new File(this.cookiedir, cookie.getName()));
writer.print(cookie.getValue());
writer.close();
if (this.uris.add(uri)) {
writer = new PrintWriter(new File(this.uridir, "uri"+this.uris.size()));
writer.print(uri.toString());
writer.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public List<HttpCookie> get(URI uri) {
System.out.println("MyCookieStore.get("+uri+")");
return this.getCookies();
}
public List<HttpCookie> getCookies() {
System.out.println("MyCookieStore.getCookies()");
return new Vector<HttpCookie>(this.cookies.values());
}
public List<URI> getURIs(){
System.out.println("MyCookieStore.getURIs()");
return new Vector<URI>(this.uris);
}
public boolean remove(URI uri, HttpCookie cookie) {
System.out.println("MyCookieStore.remove("+uri+", "+cookie+")");
this.cookies.remove(cookie.getName());
return true;
}
public boolean removeAll() {
System.out.println("MyCookieStore.removeAll()");
this.cookies.clear();
File[] files = this.cookiedir.listFiles();
for (int i = 0; i < files.length; i++) {
files[i].delete();
}
return true;
}
}
クッキーの削除抜けてた
public boolean remove(URI uri, HttpCookie cookie) {
System.out.println("MyCookieStore.remove("+uri+", "+cookie+")");
this.cookies.remove(cookie.getName());
File file = new File(this.cookiedir, cookie.getName());
if (file.exists()) file.delete();
return true;
}
おお・・・クッキーのドメインとパスを保存してないからアカン・・・アカンのか
んお!?
PONのドメインは鯖別なのか?
Twitterでやれよ
ツイッターは知らん
ドメイン別に保存するよう作り変えるわ
ドメイン別クッキー保存に修正したお
public class MyCookieStore implements CookieStore {
HashSet<URI> uris = new HashSet<URI>();
HashSet<HttpCookie> cookies = new HashSet<HttpCookie>();
File cookiedir = null;
File uridir = null;
public MyCookieStore() {
System.out.println("MyCookieStore.Constractor");
try {
this.cookiedir = new File(System.getProperty("user.dir"), "cookie");
if (this.cookiedir.exists() == false) this.cookiedir.mkdir();
File[] dirs = this.cookiedir.listFiles(new FileFilter(){
public boolean accept(File pathname) {
return pathname.isDirectory();
}
});
HttpCookie cookie = null;
for (int i = 0; i < dirs.length; i++) {
System.out.println("cookiedir["+i+"]="+dirs[i]);
File[] files = dirs[i].listFiles(new FileFilter(){
public boolean accept(File pathname) {
return pathname.isFile();
}
});
for (int j = 0; j < files.length; j++) {
System.out.println("cookiefile["+j+"]"+files[j]);
BufferedReader reader = new BufferedReader(new FileReader(files[j]));
this.cookies.add(cookie = new HttpCookie(files[j].getName(), reader.readLine()));
cookie.setDomain(reader.readLine());
cookie.setPath(reader.readLine());
cookie.setVersion(Integer.parseInt(reader.readLine()));
reader.close();
}
}
this.uridir = new File(System.getProperty("user.dir"), "uri");
if (this.uridir.exists() == false) this.uridir.mkdir();
File[] files = this.uridir.listFiles();
for (int i = 0; i < files.length; i++) {
System.out.println("uri["+i+"]="+files[i]);
BufferedReader reader = new BufferedReader(new FileReader(files[i]));
this.uris.add(new URI(reader.readLine()));
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void add(URI uri, HttpCookie cookie) {
System.out.println("MyCookieStore.add("+uri+", "+cookie+")");
try {
this.cookies.add(cookie);
File dir = new File(this.cookiedir, cookie.getDomain().replace(".", "_"));
if (dir.exists() == false) dir.mkdir();
PrintWriter writer = new PrintWriter(new File(dir, cookie.getName()));
writer.println(cookie.getValue());
writer.println(cookie.getDomain());
writer.println(cookie.getPath());
writer.println(cookie.getVersion());
writer.close();
if (this.uris.add(uri)) {
writer = new PrintWriter(new File(this.uridir, "uri"+this.uris.size()));
writer.print(uri.toString());
writer.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public List<HttpCookie> get(URI uri) {
System.out.println("MyCookieStore.get("+uri+")");
ArrayList<HttpCookie> list = new ArrayList<HttpCookie>();
try {
for (Iterator<HttpCookie> i = this.cookies.iterator(); i.hasNext(); ) {
HttpCookie cookie = i.next();
if (HttpCookie.domainMatches(cookie.getDomain(), uri.toURL().getHost())) {
list.add(cookie);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
public List<HttpCookie> getCookies() {
System.out.println("MyCookieStore.getCookies()");
return new ArrayList<HttpCookie>(this.cookies);
}
public List<URI> getURIs() {
System.out.println("MyCookieStore.getURIs()");
return new ArrayList<URI>(this.uris);
}
public boolean remove(URI uri, HttpCookie cookie) {
System.out.println("MyCookieStore.remove("+uri+", "+cookie+")");
this.cookies.remove(cookie.getName());
File file = new File(this.cookiedir, cookie.getName());
if (file.exists()) file.delete();
return true;
}
public boolean removeAll() {
System.out.println("MyCookieStore.removeAll()");
this.cookies.clear();
File[] files = this.cookiedir.listFiles();
for (int i = 0; i < files.length; i++) {
files[i].delete();
}
return true;
}
}
removeとremoveAllの修正忘れてた
public boolean remove(URI uri, HttpCookie cookie) {
System.out.println("MyCookieStore.remove("+uri+", "+cookie+")");
this.cookies.remove(cookie);
File dir = new File(this.cookiedir, cookie.getDomain().replace(".", "_"));
if (dir.exists() == false) return true;
File file = new File(dir, cookie.getName());
if (file.exists()) file.delete();
if (dir.listFiles().length == 0) dir.delete();
return true;
}
public boolean removeAll() {
System.out.println("MyCookieStore.removeAll()");
this.cookies.clear();
File[] dirs = this.cookiedir.listFiles(new FileFilter(){
public boolean accept(File pathname) {
return pathname.isDirectory();
}
});
for (int i = 0; i < dirs.length; i++) {
File[] files = dirs[i].listFiles(new FileFilter(){
public boolean accept(File pathname) {
return pathname.isFile();
}
});
for (int j = 0; j < files.length; j++) {
files[j].delete();
}
if (dirs[i].listFiles().length == 0) dirs[i].delete();
}
return true;
}
DOMのAPIマニュアルだけ見て色々試行錯誤してみてるが
やはりちゃんとググるかしないとダメぽ・・・
DocumentBuilderFactoryからDocumentBuilder作るまではよかったが
単純にファイル渡したらUTF-8がどうのこうの出て、まぁ文字コードの問題かとCharsetとか色々見て回ったけど答えにたどり着くのにかなり時間がかかった
文字コードの変換はChareset使ったデコード以外に>>119 でつかったInputStreamReaderがあるってことに気づくのにかなり時間がかかった(>>119 のコードは大半コピペだしw)
で次なる問題はDocumentBuilderにReaderは直接は渡せないと、そこでInputStreamの引数でどうしたら渡せるかと結構悩んだ
実はInputSourceというDOM用のクラスがReader渡せると気づくのにすげえ時間かかった
まとめるとこんな感じ
Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
new InputSource(new InputStreamReader(new FileInputStream(
new File(System.getProperty("user.dir"), "test.html")), Charset.forName("Shift_JIS"))));
ただ問題がそこじゃなくて、2chの書き込み確認ページのソースそのままコピーして作ったtest.htmlなんだけど
METAタグに終了タグがないというXMLのエラーが出て、エラーハンドラーなるもの設置すれば回避もできるような風なAPIドキュメントには書いてあるぽいというか
やはりググらなければ分からんだろうな、ってとこ
まさか厳格なXML定義に基づいてるのか、XMLにはあんまり明るくないのでよくは分からんが今調べてる最中
まぁ自分でドキュメント読んで調べながら作るって、ようは車輪の再開発とか言われる無駄行為なんだろうけどさ、
おそらくググれば一発解決するようなレベルなんだろうけどさ、自分で調べて考えて解決って楽しいよね?俺はそれが楽しいからやってる
Javadocっていうの?このAPIドキュメントってのは、これjavaSE1.6用の日本語のを昔DLした奴を読んでるんだが(ネットでも日本語版が公開されてるがしかも1.4〜1.6までw)
外部サイトへのリンクが死んでるの多いのな、java7用のドキュメントは全部英語で読む気しないのだが
まぁ使ってるjdkが1.7だから最新のドキュメントを読んだほうがいいのだが
あ、今気づいた、DocumentBuilderにsetErrorHandlerがあるじゃないか!これに適当なErrorHandler設定すりゃいいのかな?試してみる!
さっきのエラーメッセージからするとMETAの終了タグなしはFatal Errorらしいが、これって深刻なエラーってことだよな・・・
どうもFatalErrorはエラーハンドラー設定してもスルーできないようだ・・・パーサで何か設定するってことかな
なんと、APIドキュメントにあったDTDが気になってすべてのクラス一覧から見たらswingにhtmlの解析のパーサがあるじゃないか、これ使って試してみるか
3/5 HTML解析ツールを作る [Javaプログラミング] All About
ttp://allabout.co.jp/gm/gc/80633/3/
ここを参考にしてみたお
おーおーでけたでけt
titleタグ、inputタグ、そして2ch_X:???のコメント、body内の文章、全部簡単に取得できた・・・
DocumentBuilderとかで悩んでた苦労は何だったの一体・・・全く無意味だった・・・
今日一日必死で勉強してhtmlをマスターする
Borland C++ Compiler 5.5も入れてんだがそれのMakeでjavaもコンパイルできんのな
JC = javac
AllFiles: Test.class\
MyCookieStore.class
.path.class = class
.java class.class:
@if not exist class @mkdir class
$(JC) $. -d class
テスト用のバッチも作ってみた
j Test
で java Test を実行できる
コマンドプロンプトの補完機能で
j Test.java
でもjava Test を実行できるようにしてみた
@rem j.bat
@echo off
if "%~n1"=="" goto errorlabel1
if not exist class mkdir class
if not exist "class\%~n1.class" goto errorlabel2
java -cp class %~n1
goto endlabel
:errorlabel1
echo 引数が指定されてません
goto endlabel
:errorlabel2
echo %~n1.class が存在しません
goto endlabel
:endlabel
さっきのMakefileに合わせてmakeも簡単にできるようにバッチにしてみた
m のみで make
m Test もしくは m Test.java で make Test.class
を実行する
@rem m.bat
@echo off
if not exist class mkdir class
if "%~n1"=="" goto noargument
if not exist "%~n1.java" goto errorlabel1
make %~n1.class
goto endlabel
:noargument
make
goto endlabel
:errorlabel1
echo %~n1.java が存在しません
goto endlabel
:endlabel
初回投稿は成功したけど
2回目投稿ができないんだが・・・
ちょっと原因がわからない・・・初回投稿というのしかできない
クッキーはJava側がちゃんと処理してくれてるはずなんだが・・・
ERROR:ブラウザを立ち上げなおしてみてください。
というエラーなんだが、時間が進んでるとなるって?
unixタイム・・・って秒なのか?、つまりミリセコンドじゃないのか、そうかこれ直せばいいのかな
おお!System.currentTimeMillis()-2000が悪かったんだな!
System.currentTimeMillis()/1000-2にしたら書き込めたぞ!
念のため-2じゃなく-3600にしといた
1時間も時間がズレることはないだろうけど、10分くらいならズレそう
http://www1.axfc.net/uploader/so/2859854.zip
コードここに全部貼り付けるのは何なんで成果物をうpした
ファイル内容は
WritingTest.java
BBS2chWriter.java
MyCookieStore.java
Compile.bat
だ
compile.bat
でコンパイルして
cd class
java WritingTest
で実行な
WritingTest.javaのソースコードから鯖名や板名やスレ番を変えてくれ
ソースコードのスレは↓のスレ
てすとスレ
http://uni.2ch.net/test/read.cgi/entrance2/1341499475/
これはまだ決まったスレに書き込むことしかできないしアレだけどな
課題はまだあって忍法帖のクッキーのHAPがドメイン別に大量に発行されてまうのだが
これまとめたほうがいいんだろうな・・・
MyCookieStore.javaはまだ改良の余地が大量にあるな
やはりIEのクッキーファイルチェックしてみたが
.2ch.net指定のHAPはuni.2ch.netやtoro.2ch.netとかに保存されてないや
おお、クッキーの仕様に名前の重複はアカンとあるな、
MyCookieStore.javaがW3Cの仕様にそってないので>>167 は消した
PHPでテストしてみたが
IEもOperaもFireFoxも同名クッキーの処理してないくさいな
パスが同じ上位ドメインで同名クッキー発行しても両方送信してる・・・
同じ名前だと先に設定したクッキーのほうが前に設置され
それをPHPがクッキーだと認識してるな
パスが同じだと先に設定されたクッキーが前方に設置で送信されて
パスが違うとドメインが優先されてるのか
んん?そういうわけじゃないのか
2chのHAPだとIEもOperaもFireFoxも上位ドメインのほうのだけ記録されるけど
俺の作ったテスト用PHPだとIEもOperaもFireFoxも下位ドメインのクッキーも記録される・・・
これは一体どういうことだ!?
違うな、IEとかOperaとかFireFoxだとそもそも下位ドメインのクッキー要求が来ない
だけど俺の作ったやつだとCookieStoreのaddメソッドがHAPが2回呼ばれそれぞれドメインのレベルが違うわけだが
これはもしかしてJava側のHTTP通信の実装の問題か?
てかFireFoxにクッキーモンスターとかいう怖い仕様があったのな(7年前の記事にあった),
今はどうなんだろうか
もしかしてJavaのバグじゃなく2chのbbs.cgiのバグか?
そういえば作ったPHPのほうの挙動はIEとかと同じだった
もしbbs.cgiがUserAgentの違いで発行するクッキーが違うのだとしたら・・・
どうだろ
getHeaderFields()でヘッダを見てみたが
やはりSetCookieでドメイン指定と未指定のHAPが2つ発行されてるのな
monazilla公式だと.2ch.netのドメインが正しいようだから
HAP限定で別途処理するか・・・
HAPを2つも送信したら通信量がとんでもないからな(つかこちらからの送信は抑えられるが向こうからの送信は抑えられねえな)
スマートフォン版
掲示板管理者へ連絡
無料レンタル掲示板