WebAPIを使ってグループウェアの新着確認をしたい

タグの編集
投稿者 eigyou  (社会人) 投稿日時 2020/6/8 19:52:51
毎度お世話になります

javaを使ったグループウェアの新着確認をVB.NETを使って通知できないものかと思案しております
WebClientを使ってログイン後の受信データを取得して内容を解析して新着があれば、ポップアップで通知みたいなことを考えていましたが
受信してみたものの
内容は、フレーム対応のブラウザで表示してください と 優しく警告してくれます
ちなみに、ieで、右クリックしてみると、同じ内容でした
フレームで、ソースが見えない
ファイルで、全て保存してみると、3つのhtmと、javaのスクリプトで構成されていました
htmの内部にもスクリプトが埋め込まれており、スクリプトの実行後の内容は不明
やっぱり、この方法ではフレームで隠されていると無理でしょうか?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/6/8 20:22:23
詳細なページ構造が分からないと、具体的な手順を示すことができません…。

グループウェアに接続するために、何らかの認証情報を渡していると思いますが、そこは問題ないのでしょうか。
また、フレームが使われているとのことですが、それは <FRAMESET> を使ったページなのでしょうか、<IFRAME> を使ったページなのでしょうか。

また、そのページでは JavaScript が併用されていますか?
(WebClient はクライアント スクリプトの実行機能はありません)
投稿者 るきお  (社会人) 投稿日時 2020/6/8 20:40:56
考えられている手法としてはWebスクレイピングですね。

ブラウザーのHTMLなどテキストコンテンツの通信内容はすべて F12開発者ツールやFiddlerで確認することができます。
ブラウザーの右クリックメニューからのソースの確認には表示されないことも把握できます。
ただ、使用されているのがIEとはちょっと古いですね。

サーバーにアクセスできるのであればHTMLの内容をWebClientで取得して解析することはできますが、魔界の仮面弁士さんが指摘されているよう認証やスクリプトの問題があります。もともとスクレイピングされる前提でページを作ることはまずないので、この辺りは苦戦するかもしれません。特にグループウェア系は汎用のつくりになっているためこのあたりの構造はなかなか複雑なものが多いと思います。

グループウェアであれば文字通りWebAPIがサポートされているかもしれないので、そちらを調べてみるアプローチが良いと思います。
たとえば、サイボウズのガルーンの場合は、下記のようなWebAPIが使用できるようです。
https://developer.cybozu.io/hc/ja/articles/360000577946-Garoon-REST-API-%E4%B8%80%E8%A6%A7

グループウェア名 + " WebAPI" で検索すれば何か情報がでるかもしれません。
投稿者 eigyou  (社会人) 投稿日時 2020/6/9 18:37:21

魔界の仮面弁士様
るきお様

ご返信ありがとうございます。
WebClientには、スクリプト実行できないとのこと
んんこれは、私の実力では無理っぽいです

新着件数が表記されているフレームのアドレスが判ったので、

ブラウザで、ログインして、該当フレームのアドレスを入力して
表示させると、ソースが見えました


<a href="../ショートメール.do?smlViewAccount=2"><span class="text_r2">&nbsp;&nbsp;・&nbsp;山田&nbsp;太郎: 1件 </span></a>

てな感じでありました

で、試しで読み込みやってみましたが、やっぱダメでした

ログインは、エラーが返ってこないので、ログインできているようには思えますが
続いて、新着表記のあるフレームを読み込むと、不正アクセスですと宣われます。
認証をどこで、保持されているのか判ってないので、なんともです
セッションが新しいセッションと判断されてしまうのか??


 	Dim url As String = "http://サーバ名/ログイン.do"

        Dim wc As New System.Net.WebClient
        'NameValueCollectionの作成 
        Dim ps As New System.Collections.Specialized.NameValueCollection
        '送信するデータを追加 
        ps.Add("ユーザID""myouji.namae")
        ps.Add("ユーザパスワード""password")
        ps.Add("コマンド""login")

        'ログインし、トップページを受信 
        Dim resData As Byte() = wc.UploadValues(url, ps)



        '新着件数の表記のあるフレームを読み出す 
        Dim st As Stream = wc.OpenRead("http://サーバ名/メインフレーム.do")

        Dim enc As Encoding = Encoding.UTF8
        Dim sr As StreamReader = New StreamReader(st, enc)
        Dim html As String = sr.ReadToEnd()
        sr.Close()
        st.Close()

        TextBox1.Text = html

        wc.Dispose()

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/6/9 20:10:39
> ps.Add("ユーザID", "myouji.namae")
> ps.Add("ユーザパスワード", "password")
> ps.Add("コマンド", "login")

こういう書き方をするということは、BASIC 認証ではなく、
いわゆる FORM  認証のサイトなのでしょうね。

Web システムはそのままだとステートレスになるので、
ログイン状態を維持させるには、Cookie 情報の保持が必要になるはずです。
下記を参考にしてみてください。
https://dobon.net/vb/dotnet/internet/usecookie.html

ごく稀に、Cookie を用いずに、ページ遷移のたびに
異なるワンタイムキーを返してくるタイプのサーバーもありますが、
大抵は 揮発性 Cookie を用いているはず。


FORM 認証以外のパターンはこちら。
https://dobon.net/vb/dotnet/internet/usecredentials.html
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/6/9 20:21:58
> 下記を参考にしてみてください。
> https://dobon.net/vb/dotnet/internet/usecookie.html
上記は HttpWebRequest で Cookie を使う場合の例です。

WebClient で Cookie を使う場合は下記を参考にしてみてください。
(C# による解説なので、適宜、VB に読み替えてください)
http://neue.cc/2009/12/17_230.html



>>> 考えられている手法としてはWebスクレイピングですね。
Web スクレイピングが目的なら、AngleSharp の併用もお奨めです。
https://www.nuget.org/packages/AngleSharp
https://www.nuget.org/packages/AngleSharp.Scripting.JavaScript/
投稿者 eigyou  (社会人) 投稿日時 2020/6/10 20:38:38
魔界の仮面弁士様

回答ありがとうございます
解決しました!!
グループウェアの設定で、WEBAPI向け設定で、ベーシック認証を有効にするがあったので、有効にしてみましたが、ベーシック認証が通らずはへ?
で、教えて頂いたhttp://neue.cc/2009/12/17_230.html で、WebClientで、VBに読み替えしていたのですが、んん判らないがコード出てきました
このページで紹介されていたHttpWebRequestを利用した場合のサイト
https://www.atmarkit.co.jp/fdotnet/dotnettips/326cookie/cookie.htm

のコード頂戴して 無事読み込むことができました

ありがとうございました