root/lang/vb2005/Tween/Tween/Twitter.vb @ 23370

Revision 23370, 165.3 kB (checked in by syo68k, 6 years ago)

URL短縮変換メニューに「自動判定」を追加。URL短縮変換エンジンをTwitter.vbへ移動。「自動判定」にCTRL+Lを割り当て。

  • Property svn:mime-type set to application/octet-stream
Line 
1Imports System.Web
2Imports System.Xml
3Imports System.Text
4Imports System.Text.RegularExpressions
5
6Partial Public Class Twitter
7    Public links As New Collections.Specialized.StringCollection
8    Public follower As New Collections.Specialized.StringCollection
9
10    Private _authKey As String              'StatusUpdate、発言削除で使用
11    Private _authKeyDM As String              'DM送信、DM削除で使用
12    'Private _authSiv As String              'StatusUpdate等で使用
13
14    Private _uid As String
15    Private _pwd As String
16    Private _proxyType As ProxyTypeEnum
17    Private _proxyAddress As String
18    Private _proxyPort As Integer
19    Private _proxyUser As String
20    Private _proxyPassword As String
21
22    'Private _lastId As String
23    'Private _lastName As String
24    Private _nextThreshold As Integer
25    Private _nextPages As Integer
26    'Private _iconSz As Integer
27
28    Private _infoTwitter As String = ""
29
30    Private _signed As Boolean
31    Private _mySock As MySocket
32
33    Private _hubServer As String
34
35    Private _getIcon As Boolean
36    Private _tinyUrlResolve As Boolean
37    Private _dmCount As Integer
38    Private _restrictFavCheck As Boolean
39
40    Private Const _baseUrlStr As String = "twitter.com"
41    Private Const _loginPath As String = "/sessions"
42    Private Const _homePath As String = "/home"
43    Private Const _replyPath As String = "/replies"
44    Private Const _DMPathRcv As String = "/direct_messages"
45    Private Const _DMPathSnt As String = "/direct_messages/sent"
46    Private Const _DMDestroyPath As String = "/direct_messages/destroy/"
47    Private Const _StDestroyPath As String = "/status/destroy/"
48    'Private Const _uidHeader As String = "username_or_email="
49    Private Const _uidHeader As String = "session[username_or_email]="
50    'Private Const _pwdHeader As String = "password="
51    Private Const _pwdHeader As String = "session[password]="
52    Private Const _pageQry As String = "?page="
53    Private Const _statusHeader As String = "status="
54    Private Const _statusUpdatePath As String = "/status/update?page=1&tab=home"
55    'Private Const _statusUpdatePath1 As String = "/status/update?page=1&"
56    'Private Const _statusUpdatePath2 As String = "&tab=home"
57    Private Const _statusUpdatePathAPI As String = "/statuses/update.xml"
58    Private Const _linkToOld As String = "class=""section_links"" rel=""prev"""
59    Private Const _postFavAddPath As String = "/favourings/create/"
60    Private Const _postFavRemovePath As String = "/favourings/destroy/"
61    Private Const _authKeyHeader As String = "authenticity_token="
62    Private Const _parseLink1 As String = "<a href="""
63    Private Const _parseLink2 As String = """>"
64    Private Const _parseLink3 As String = "</a>"
65    Private Const _GetFollowers As String = "/statuses/followers.xml"
66    Private Const _ShowStatus As String = "/statuses/show/"
67
68    Private _endingFlag As Boolean
69    Private _useAPI As Boolean
70
71    '''Wedata対応
72    Private Const wedataUrl As String = "http://wedata.net/databases/Tween/items.json"
73    'テーブル
74    Private Const tbGetMsgDM As String = "GetMsgDM"
75    Private Const tbSplitDM As String = "SplitDM"
76    Private Const tbFollower As String = "Follower"
77    Private Const tbGetStar As String = "GetStar"
78    Private Const tbIsReply As String = "IsReply"
79    Private Const tbGetDate As String = "GetDate"
80    Private Const tbGetMsg As String = "GetMsg"
81    Private Const tbIsProtect As String = "IsProtect"
82    Private Const tbGetImagePath As String = "GetImagePath"
83    Private Const tbGetNick As String = "GetNick"
84    Private Const tbGetName As String = "GetName"
85    'Private Const tbGetSiv As String = "GetSiv"
86    Private Const tbStatusID As String = "StatusID"
87    Private Const tbSplitPostRecent As String = "SplitPostRecent"
88    Private Const tbAuthKey As String = "AuthKey"
89    Private Const tbInfoTwitter As String = "InfoTwitter"
90    Private Const tbSplitPostReply As String = "SplitPostReply"
91    Private Const tbGetDMCount As String = "GetDMCount"
92    '属性
93    Private Const tbTagFrom As String = "tagfrom"
94    Private Const tbTagTo As String = "tagto"
95    Private Const tbTag As String = "tag"
96    Private Const tbTagMbrFrom As String = "tagmbrfrom"
97    Private Const tbTagMbrFrom2 As String = "tagmbrfrom2"
98    Private Const tbTagMbrTo As String = "tagmbrto"
99    Private Const tbTagStatus As String = "status"
100    Private Const tbTagJpnFrom As String = "tagjpnfrom"
101    Private Const tbTagEngFrom As String = "tagengfrom"
102
103    Public savePost As String
104
105    '画像の非同期取得
106    '''Delegate Sub ThreadGetIcon(ByVal urlStr As String)
107    '''Shared _threadGetIcon As ThreadGetIcon
108
109    'Public Structure MyLinks
110    '    Public StartIndex As Integer
111    '    Public Length As Integer
112    '    Public UrlString As String
113    'End Structure
114
115    Public Structure MyListItem
116        Public Nick As String
117        Public Data As String
118        Public ImageUrl As String
119        Public Name As String
120        Public PDate As DateTime
121        Public Id As String
122        Public Fav As Boolean
123        Public OrgData As String
124        Public Readed As Boolean
125        Public Reply As Boolean
126        Public Protect As Boolean
127        Public OWL As Boolean
128    End Structure
129
130    Public Enum GetTypes
131        GET_TIMELINE
132        GET_REPLY
133        GET_DMRCV
134        GET_DMSNT
135    End Enum
136    Public Enum UrlConverter
137        TinyUrl
138        Isgd
139    End Enum
140
141
142    Public Sub New(ByVal Username As String, _
143                ByVal Password As String, _
144                ByVal ProxyType As ProxyTypeEnum, _
145                ByVal ProxyAddress As String, _
146                ByVal ProxyPort As Integer, _
147                ByVal ProxyUser As String, _
148                ByVal ProxyPassword As String)
149        'Proxyを考慮したSocketの宛先設定
150        'TIconSmallList = New ImageList
151        'TIconSmallList.ImageSize = New Size(_iconSz, _iconSz)
152        'TIconSmallList.ColorDepth = ColorDepth.Depth32Bit
153        _mySock = New MySocket("UTF-8", Username, Password, ProxyType, ProxyAddress, ProxyPort, ProxyUser, ProxyPassword)
154        _uid = Username
155        _pwd = Password
156        follower.Add(_uid)
157        _proxyType = ProxyType
158        _proxyAddress = ProxyAddress
159        _proxyPort = ProxyPort
160        _proxyUser = ProxyUser
161        _proxyPassword = ProxyPassword
162    End Sub
163
164    Private Function SignIn() As String
165        If _endingFlag Then Return ""
166
167        'ユーザー情報からデータ部分の生成
168        Dim account As String = _uidHeader + _uid + "&" + _pwdHeader + _pwd
169
170        '未認証
171        _signed = False
172
173        Dim resStatus As String = ""
174        Dim resMsg As String = ""
175
176        resMsg = DirectCast(_mySock.GetWebResponse("https://" + _hubServer + _loginPath, resStatus, MySocket.REQ_TYPE.ReqPOST, account), String)
177        If resMsg.Length = 0 Then
178            Return "SignIn -> " + resStatus
179        End If
180
181        '*************** ログイン失敗時の判定 ****************
182        'resMsgの中身を判定する
183        '*****************************************************
184
185        _signed = True
186        Return ""
187    End Function
188
189    Public Function GetTimeline(ByVal tLine As List(Of MyListItem), ByVal page As Integer, ByVal initial As Boolean, ByRef endPage As Integer, ByVal gType As GetTypes, ByVal imgKeys As Collections.Specialized.StringCollection, ByVal imgs As ImageList, ByRef getDM As Boolean) As String
190        If _endingFlag Then Return ""
191
192        Dim retMsg As String = ""
193        Dim resStatus As String = ""
194        Dim moreRead As Boolean = True
195        'Dim oldID As String = ""
196        'Dim oldName As String = ""
197
198        'If initial Then
199        '    oldID = _lastId
200        '    oldName = _lastName
201        'End If
202
203        If _signed = False Then
204            retMsg = SignIn()
205            If retMsg.Length > 0 Then
206                Return retMsg
207            End If
208        End If
209
210        'リクエストメッセージを作成する
211        Dim pageQuery As String
212
213        If page = 1 Then
214            pageQuery = ""
215        Else
216            pageQuery = _pageQry + page.ToString
217        End If
218        'pageQuery = _pageQry + page.ToString
219
220        If gType = GetTypes.GET_TIMELINE Then
221            retMsg = DirectCast(_mySock.GetWebResponse("https://" + _hubServer + _homePath + pageQuery, resStatus), String)
222        Else
223            retMsg = DirectCast(_mySock.GetWebResponse("https://" + _hubServer + _replyPath + pageQuery, resStatus), String)
224        End If
225
226        If _endingFlag Then Return ""
227
228        If retMsg.Length = 0 Then
229            _signed = False
230            Return resStatus
231        End If
232
233        '****************** Busy時の応答判定 ****************
234        '****************************************************
235
236
237        Dim pos1 As Integer
238        Dim pos2 As Integer
239
240
241        '各メッセージに分割可能か?
242        Dim strSepTmp As String
243        If gType = GetTypes.GET_TIMELINE Then
244            strSepTmp = _splitPostRecent
245        Else
246            strSepTmp = _splitPost
247        End If
248        pos1 = retMsg.IndexOf(strSepTmp)
249        If pos1 = -1 Then
250            '0件 or 取得失敗
251            _signed = False
252            Return "GetTimeline -> Err: tweets count is 0."
253        End If
254
255        Dim strSep() As String = {strSepTmp}
256        Dim posts() As String = retMsg.Split(strSep, StringSplitOptions.RemoveEmptyEntries)
257        Dim strPost As String = ""
258        Dim intCnt As Integer = 0
259        Dim listCnt As Integer = tLine.Count
260        Dim orgData As String = ""
261        Dim tmpDate As DateTime = Now
262        '''Dim imgKeys As Collections.Specialized.StringCollection = TIconList.Images.Keys
263
264        '''_threadGetIcon = New ThreadGetIcon(AddressOf GetIconImage)
265        '''Dim ar(posts.Length) As IAsyncResult
266
267        For Each strPost In posts
268            savePost = strPost
269            intCnt += 1
270            '''ar(intCnt) = Nothing
271
272            If intCnt = 1 Then
273                If page = 1 And gType = GetTypes.GET_TIMELINE Then
274                    ''siv取得
275                    'pos1 = strPost.IndexOf(_getSiv, 0)
276                    'If pos1 > 0 Then
277                    '    pos2 = strPost.IndexOf(_getSivTo, pos1 + _getSiv.Length)
278                    '    If pos2 > -1 Then
279                    '        _authSiv = strPost.Substring(pos1 + _getSiv.Length, pos2 - pos1 - _getSiv.Length)
280                    '    Else
281                    '        '取得失敗
282                    '        _signed = False
283                    '        Return "GetTimeline -> Err: Can't get Siv."
284                    '    End If
285                    'Else
286                    '    '取得失敗
287                    '    _signed = False
288                    '    Return "GetTimeline -> Err: Can't get Siv."
289                    'End If
290
291                    'AuthKeyの取得
292                    If GetAuthKey(retMsg) < 0 Then
293                        _signed = False
294                        Return "GetTimeline -> Err: Can't get auth token."
295                    End If
296
297                    'TwitterInfoの取得
298                    pos1 = retMsg.IndexOf(_getInfoTwitter)
299                    If pos1 > -1 Then
300                        pos2 = retMsg.IndexOf(_getInfoTwitterTo, pos1)
301                        If pos2 > -1 Then
302                            _infoTwitter = retMsg.Substring(pos1 + _getInfoTwitter.Length, pos2 - pos1 - _getInfoTwitter.Length)
303                        Else
304                            _infoTwitter = ""
305                        End If
306                    Else
307                        _infoTwitter = ""
308                    End If
309                End If
310            Else
311
312                Dim lItem As New MyListItem
313
314                Try
315                    'Get ID
316                    pos1 = 0
317                    pos2 = strPost.IndexOf(_statusIdTo, 0)
318                    lItem.Id = HttpUtility.HtmlDecode(strPost.Substring(0, pos2))
319                Catch ex As Exception
320                    _signed = False
321                    Return "GetTimeline -> Err: Can't get ID."
322                End Try
323                'Get Name
324                Try
325                    pos1 = strPost.IndexOf(_parseName, pos2)
326                    pos2 = strPost.IndexOf(_parseNameTo, pos1)
327                    lItem.Name = HttpUtility.HtmlDecode(strPost.Substring(pos1 + _parseName.Length, pos2 - pos1 - _parseName.Length))
328                Catch ex As Exception
329                    _signed = False
330                    Return "GetTimeline -> Err: Can't get Name."
331                End Try
332                'Get Nick
333                '''バレンタイン対応
334                If strPost.IndexOf("twitter.com/images/heart.png", pos2) > -1 Then
335                    lItem.Nick = lItem.Name
336                Else
337                    Try
338                        pos1 = strPost.IndexOf(_parseNick, pos2)
339                        pos2 = strPost.IndexOf(_parseNickTo, pos1 + _parseNick.Length)
340                        lItem.Nick = HttpUtility.HtmlDecode(strPost.Substring(pos1 + _parseNick.Length, pos2 - pos1 - _parseNick.Length))
341                    Catch ex As Exception
342                        _signed = False
343                        Return "GetTimeline -> Err: Can't get Nick."
344                    End Try
345                End If
346
347                'If initial Then
348                '    '起動時
349                '    If oldID = lItem.Id And oldName = lItem.Name Then
350                '        '前回既読ポストなら読み込み終了
351                '        moreRead = False
352                '    End If
353                'End If
354
355                '二重取得回避
356                If links.Contains(lItem.Id) = False Then
357                    orgData = ""
358                    'バレンタイン
359                    If strPost.IndexOf("<form action=""/status/update"" id=""heartForm", 0) > -1 Then
360                        Try
361                            pos1 = strPost.IndexOf("<strong>", 0)
362                            pos2 = strPost.IndexOf("</strong>", pos1)
363                            orgData = strPost.Substring(pos1 + 8, pos2 - pos1 - 8)
364                        Catch ex As Exception
365                            _signed = False
366                            Return "GetTimeline -> Err: Can't get Valentine body."
367                        End Try
368                    End If
369
370
371                    'Get ImagePath
372                    Try
373                        pos1 = strPost.IndexOf(_parseImg, pos2)
374                        pos2 = strPost.IndexOf(_parseImgTo, pos1 + _parseImg.Length)
375                        lItem.ImageUrl = HttpUtility.HtmlDecode(strPost.Substring(pos1 + _parseImg.Length, pos2 - pos1 - _parseImg.Length))
376                    Catch ex As Exception
377                        _signed = False
378                        Return "GetTimeline -> Err: Can't get ImagePath."
379                    End Try
380
381                    'Protect
382                    If strPost.IndexOf(_isProtect, pos2) > -1 Then
383                        lItem.Protect = True
384                    End If
385
386                    'Get Message
387                    pos1 = strPost.IndexOf(_parseMsg1, pos2)
388                    'If pos1 < 0 Then
389                    '    'Twitterポカミス対応
390                    '    pos1 = strPost.IndexOf(_parseMsg1_2, pos2)
391                    'End If
392                    If pos1 < 0 Then
393                        'Valentine対応その2
394                        Try
395                            If strPost.IndexOf("<div id=""doyouheart", pos2) > -1 Then
396                                orgData += " <3 you! Do you <3 "
397                                pos1 = strPost.IndexOf("<a href", pos2)
398                                pos2 = strPost.IndexOf("?", pos1)
399                                orgData += strPost.Substring(pos1, pos2 - pos1 + 1)
400                            Else
401                                'pos1 = strPost.IndexOf("."" />", pos2)
402                                pos1 = strPost.IndexOf(_parseProtectMsg1, pos2)
403                                If pos1 = -1 Then
404                                    'If orgData <> "You" Then
405                                    '    orgData += lItem.Name + " <3 's "
406                                    'Else
407                                    orgData += " <3 's "
408                                    'End If
409                                    pos1 = strPost.IndexOf("<a href", pos2)
410                                    If pos1 > -1 Then
411                                        pos2 = strPost.IndexOf("!", pos1)
412                                        orgData += strPost.Substring(pos1, pos2 - pos1 + 1)
413                                    End If
414                                Else
415                                    'pos2 = strPost.IndexOf("<span class=""meta entry-meta"">", pos1)
416                                    pos2 = strPost.IndexOf(_parseProtectMsg2, pos1)
417                                    orgData = strPost.Substring(pos1 + _parseProtectMsg1.Length, pos2 - pos1 - _parseProtectMsg1.Length).Trim()
418                                End If
419                            End If
420                        Catch ex As Exception
421                            _signed = False
422                            Return "GetTimeline -> Err: Can't get Valentine body2."
423                        End Try
424                    Else
425                        Try
426                            pos2 = strPost.IndexOf(_parseMsg2, pos1)
427                            orgData = strPost.Substring(pos1 + _parseMsg1.Length, pos2 - pos1 - _parseMsg1.Length).Trim()
428                        Catch ex As Exception
429                            _signed = False
430                            Return "GetTimeline -> Err: Can't get body."
431                        End Try
432                        orgData = orgData.Replace("&lt;3", "♡")
433                    End If
434
435                    Dim posl1 As Integer
436                    Dim posl2 As Integer = 0
437                    Dim posl3 As Integer
438
439                    If _tinyUrlResolve Then
440                        Do While True
441                            If orgData.IndexOf("<a href=""http://tinyurl.com/", posl2) > -1 Then
442                                Dim urlStr As String
443                                Try
444                                    posl1 = orgData.IndexOf("<a href=""http://tinyurl.com/", posl2)
445                                    posl1 = orgData.IndexOf("http://tinyurl.com/", posl1)
446                                    posl2 = orgData.IndexOf("""", posl1)
447                                    urlStr = orgData.Substring(posl1, posl2 - posl1)
448                                Catch ex As Exception
449                                    _signed = False
450                                    Return "GetTimeline -> Err: Can't get tinyurl."
451                                End Try
452                                Dim Response As String = ""
453                                Dim retUrlStr As String = ""
454                                retUrlStr = DirectCast(_mySock.GetWebResponse(urlStr, Response, MySocket.REQ_TYPE.ReqGETForwardTo), String)
455                                If retUrlStr.Length > 0 Then
456                                    orgData = orgData.Replace("<a href=""" + urlStr, "<a href=""" + retUrlStr)
457                                End If
458                            ElseIf orgData.IndexOf("<a href=""http://is.gd/", posl2) > -1 Then
459                                Dim urlStr As String
460                                Try
461                                    posl1 = orgData.IndexOf("<a href=""http://is.gd/", posl2)
462                                    posl1 = orgData.IndexOf("http://is.gd/", posl1)
463                                    posl2 = orgData.IndexOf("""", posl1)
464                                    urlStr = orgData.Substring(posl1, posl2 - posl1)
465                                Catch ex As Exception
466                                    _signed = False
467                                    Return "GetTimeline -> Err: Can't get is.gd."
468                                End Try
469                                Dim Response As String = ""
470                                Dim retUrlStr As String = ""
471                                retUrlStr = DirectCast(_mySock.GetWebResponse(urlStr, Response, MySocket.REQ_TYPE.ReqGETForwardTo), String)
472                                If retUrlStr.Length > 0 Then
473                                    orgData = orgData.Replace("<a href=""" + urlStr, "<a href=""" + retUrlStr)
474                                End If
475                            Else
476                                Exit Do
477                            End If
478                        Loop
479
480                    End If
481
482                    lItem.OrgData = orgData
483                    lItem.OrgData = lItem.OrgData.Replace("<a href=""/", "<a href=""https://twitter.com/")
484                    lItem.OrgData = lItem.OrgData.Replace("<a href=", "<a target=""_self"" href=")
485                    lItem.OrgData = lItem.OrgData.Replace(vbLf, "<br>")
486                    'lItem.OrgData = HttpUtility.HtmlDecode(lItem.OrgData)
487                    'orgData = HttpUtility.HtmlDecode(orgData)
488
489                    'Dim LinkCol As New List(Of MyLinks)
490
491                    Try
492                        If orgData.IndexOf(_parseLink1) = -1 Then
493                            lItem.Data = HttpUtility.HtmlDecode(orgData)
494                        Else
495                            lItem.Data = ""
496                            'posl1 = orgData.IndexOf(_parseLink1)
497
498                            posl3 = 0
499                            Do While True
500                                'Dim _myLink As New MyLinks
501                                'Dim tmpLink As String
502
503                                posl1 = orgData.IndexOf(_parseLink1, posl3)
504                                If posl1 = -1 Then Exit Do
505
506                                If (posl3 + _parseLink3.Length <> posl1) Or posl3 = 0 Then
507                                    If posl3 <> 0 Then
508                                        lItem.Data += HttpUtility.HtmlDecode(orgData.Substring(posl3 + _parseLink3.Length, posl1 - posl3 - _parseLink3.Length))
509                                    Else
510                                        lItem.Data += HttpUtility.HtmlDecode(orgData.Substring(0, posl1))
511                                    End If
512                                End If
513                                posl2 = orgData.IndexOf(_parseLink2, posl1)
514                                posl3 = orgData.IndexOf(_parseLink3, posl2)
515                                '_myLink.StartIndex = lItem.Data.Length
516                                'tmpLink = HttpUtility.HtmlDecode(orgData.Substring(posl2 + _parseLink2.Length, posl3 - posl2 - _parseLink2.Length))
517                                lItem.Data += HttpUtility.HtmlDecode(orgData.Substring(posl2 + _parseLink2.Length, posl3 - posl2 - _parseLink2.Length))
518                                '_myLink.Length = tmpLink.Length
519                                '_myLink.UrlString = orgData.Substring(posl1 + _parseLink1.Length, posl2 - posl1 - _parseLink1.Length)
520                                'If _myLink.UrlString.IndexOf(_IsHTTP) = -1 Then
521                                '    _myLink.UrlString = "http://" + _hubServer + _myLink.UrlString
522                                'End If
523                                'If _myLink.UrlString.IndexOf("""") >= 0 Then
524                                '    _myLink.UrlString = _myLink.UrlString.Substring(0, _myLink.UrlString.IndexOf(""""))
525                                'End If
526                                'LinkCol.Add(_myLink)
527                            Loop
528
529                            lItem.Data += HttpUtility.HtmlDecode(orgData.Substring(posl3 + _parseLink3.Length))
530                        End If
531                    Catch ex As Exception
532                        _signed = False
533                        Return "GetTimeline -> Err: Can't parse links."
534                    End Try
535
536                    'Get Date
537                    pos1 = strPost.IndexOf(_parseDate, pos2)
538                    If pos1 > -1 Then
539                        Try
540                            pos2 = strPost.IndexOf(_parseDateTo, pos1 + _parseDate.Length)
541                            lItem.PDate = DateTime.ParseExact(strPost.Substring(pos1 + _parseDate.Length, pos2 - pos1 - _parseDate.Length), "yyyy'-'MM'-'dd'T'HH':'mm':'sszzz", System.Globalization.DateTimeFormatInfo.InvariantInfo, Globalization.DateTimeStyles.None)
542                            tmpDate = lItem.PDate
543                        Catch ex As Exception
544                            _signed = False
545                            Return "GetTimeline -> Err: Can't get date."
546                        End Try
547                    Else
548                        lItem.PDate = tmpDate
549                    End If
550
551                    'Get Reply
552                    If strPost.IndexOf(_isReplyEng + _uid + _isReplyTo) > 0 Or strPost.IndexOf(_isReplyJpn + _uid + _isReplyTo) > 0 Then
553                        lItem.Reply = True
554                    Else
555                        lItem.Reply = False
556                    End If
557
558                    'Get Fav
559                    pos1 = strPost.IndexOf(_parseStar, pos2)
560                    If pos1 > -1 Then
561                        Try
562                            pos2 = strPost.IndexOf(_parseStarTo, pos1 + _parseStar.Length)
563                            If strPost.Substring(pos1 + _parseStar.Length, pos2 - pos1 - _parseStar.Length) = _parseStarEmpty Then
564                                lItem.Fav = False
565                            Else
566                                lItem.Fav = True
567                            End If
568                        Catch ex As Exception
569                            _signed = False
570                            Return "GetTimeline -> Err: Can't get fav status."
571                        End Try
572                    Else
573                        lItem.Fav = False
574                    End If
575
576                    'Imageの取得
577                    '''If imgKeys.Contains(lItem.ImageUrl) = False Then
578                    '''    imgKeys.Add(lItem.ImageUrl)
579                    '''    ar(intCnt) = _threadGetIcon.BeginInvoke(lItem.ImageUrl, Nothing, Nothing)
580                    '''    'retMsg = GetIconImage(lItem.ImageUrl, TIconList, TIconSmallList)
581                    '''    'If retMsg.Length > 0 Then
582                    '''    '    Return retMsg
583                    '''    'End If
584                    '''End If
585                    If imgKeys.Contains(lItem.ImageUrl) = False Then
586                        GetIconImage(lItem.ImageUrl, imgKeys, imgs)
587                    End If
588
589                    If _endingFlag Then Return ""
590
591                    'links.Add(lItem.Name + "_" + lItem.Id, LinkCol)
592                    links.Add(lItem.Id)
593                    tLine.Add(lItem)
594                End If
595
596                'テスト実装:DMカウント取得
597                getDM = False
598                If intCnt = posts.Length And gType = GetTypes.GET_TIMELINE And page = 1 Then
599                    pos1 = strPost.IndexOf(_parseDMcountFrom, pos2)
600                    If pos1 > -1 Then
601                        Try
602                            pos2 = strPost.IndexOf(_parseDMcountTo, pos1 + _parseDMcountFrom.Length)
603                            Dim dmCnt As Integer = Integer.Parse(strPost.Substring(pos1 + _parseDMcountFrom.Length, pos2 - pos1 - _parseDMcountFrom.Length))
604                            If dmCnt > _dmCount Then
605                                _dmCount = dmCnt
606                                getDM = True
607                            End If
608                        Catch ex As Exception
609                        End Try
610                    End If
611                End If
612            End If
613        Next
614
615        '非同期のアイコン読み込み終了待ち
616        '''For intCnt = 1 To ar.Length - 1
617        '''    If Not ar(intCnt) Is Nothing Then
618        '''        Do While ar(intCnt).IsCompleted = False
619        '''            System.Threading.Thread.Sleep(500)
620        '''        Loop
621        '''    End If
622        '''Next
623
624        Dim getCnt As Integer
625        getCnt = tLine.Count - listCnt
626        If getCnt > 0 Then
627            '新規取得有
628            If initial Then
629                '起動時
630                'If strPost.IndexOf(_linkToOld) > -1 Then
631                '最大でも最終ページまで、前回既読位置記録有→前回既読位置まで
632                If moreRead Then
633                    '前回既読ポストなし→次頁読み込み
634                    endPage = page + 1
635                    'retMsg = GetTimeline(tLine, page + 1, True, endPage)
636                    'If retMsg.Length > 0 Then
637                    '    'エラーがあったら終了
638                    '    Return retMsg
639                    'End If
640                End If
641                'End If
642            End If
643        End If
644        '通常時
645        If ((page = 1 And getCnt >= _nextThreshold) Or page > 1) And initial = False Then
646            '新着が閾値の件数以上なら、次のページも念のため読み込み
647            endPage = _nextPages + 1
648            'If page + 1 <= _nextPages Then
649            '    endPage = page + _nextPages
650            'End If
651
652            'For cnt As Integer = 1 To _nextPages
653            '    If endPage < page + cnt Then
654            '        retMsg = GetTimeline(tLine, page + cnt, False, endPage)
655            '        If retMsg.Length > 0 Then
656            '            Return retMsg
657            '        End If
658            '    End If
659            'Next
660        End If
661
662        Return ""
663    End Function
664
665    Public Function GetDirectMessage(ByVal tLine As List(Of MyListItem), ByVal page As Integer, ByRef endPage As Integer, ByVal gType As GetTypes, ByVal imgKeys As Collections.Specialized.StringCollection, ByVal imgs As ImageList) As String
666        If _endingFlag Then Return ""
667
668        Dim retMsg As String = ""
669        Dim resStatus As String = ""
670        Dim moreRead As Boolean = True
671        Dim oldID As String = ""
672        Dim oldName As String = ""
673
674        endPage = page
675
676        If _signed = False Then
677            retMsg = SignIn()
678            If retMsg.Length > 0 Then
679                Return retMsg
680            End If
681        End If
682
683        If _endingFlag Then Return ""
684
685        'リクエストメッセージを作成する
686        Dim pageQuery As String
687
688        'If page = 1 Then
689        '    pageQuery = ""
690        'Else
691        '    pageQuery = _pageQry + page.ToString
692        'End If
693        pageQuery = _pageQry + page.ToString
694
695        If gType = GetTypes.GET_DMRCV Then
696            retMsg = DirectCast(_mySock.GetWebResponse("https://" + _hubServer + _DMPathRcv + pageQuery, resStatus), String)
697        Else
698            retMsg = DirectCast(_mySock.GetWebResponse("https://" + _hubServer + _DMPathSnt + pageQuery, resStatus), String)
699        End If
700        If retMsg.Length = 0 Then
701            _signed = False
702            Return resStatus
703        End If
704
705        If _endingFlag Then Return ""
706
707        '****************** Busy時の応答判定 ****************
708        '****************************************************
709
710        ''AuthKeyの取得
711        'If GetAuthKeyDM(retMsg) < 0 Then
712        '    _signed = False
713        '    Return "GetDirectMessage -> Err: Busy(1)"
714        'End If
715
716        Dim pos1 As Integer
717        Dim pos2 As Integer
718
719        ''Followerの抽出
720        'If page = 1 And gType = GetTypes.GET_DMRCV Then
721        '    pos1 = retMsg.IndexOf(_followerList)
722        '    If pos1 = -1 Then
723        '        '取得失敗
724        '        _signed = False
725        '        Return "GetDirectMessage -> Err: Busy(3)"
726        '    End If
727        '    follower.Clear()
728        '    follower.Add(_uid)
729        '    pos1 += _followerList.Length
730        '    pos1 = retMsg.IndexOf(_followerMbr1, pos1)
731        '    Try
732        '        Do While pos1 > -1
733        '            pos2 = retMsg.IndexOf(_followerMbr2, pos1)
734        '            pos1 = retMsg.IndexOf(_followerMbr3, pos2)
735        '            follower.Add(retMsg.Substring(pos2 + _followerMbr2.Length, pos1 - pos2 - _followerMbr2.Length))
736        '            pos1 = retMsg.IndexOf(_followerMbr1, pos1)
737        '        Loop
738        '    Catch ex As Exception
739        '        _signed = False
740        '        Return "GetDirectMessage -> Err: Can't get followers"
741        '    End Try
742        'End If
743
744        '各メッセージに分割可能か?
745        pos1 = retMsg.IndexOf(_splitDM)
746        If pos1 = -1 Then
747            '0件
748            Return ""
749        End If
750
751        Dim strSep() As String = {_splitDM}
752        Dim posts() As String = retMsg.Split(strSep, StringSplitOptions.RemoveEmptyEntries)
753        Dim strPost As String = ""
754        Dim intCnt As Integer = 0
755        Dim listCnt As Integer = tLine.Count
756        Dim orgData As String = ""
757        Dim tmpDate As DateTime = Now
758        '''Dim imgKeys As Collections.Specialized.StringCollection = TIconList.Images.Keys
759
760        '''_threadGetIcon = New ThreadGetIcon(AddressOf GetIconImage)
761        '''Dim ar(posts.Length) As IAsyncResult
762
763        For Each strPost In posts
764            savePost = strPost
765            intCnt += 1
766            '''ar(intCnt) = Nothing
767
768            If intCnt > 1 Then
769                Dim lItem As New MyListItem
770                Dim flg As Boolean = False
771
772                'Get ID
773                Try
774                    pos1 = 0
775                    pos2 = strPost.IndexOf("""", 0)
776                    lItem.Id = HttpUtility.HtmlDecode(strPost.Substring(0, pos2))
777                Catch ex As Exception
778                    _signed = False
779                    Return "GetDirectMessage -> Err: Can't get ID"
780                End Try
781
782                'Get Name
783                Try
784                    pos1 = strPost.IndexOf(_parseName, pos2)
785                    pos2 = strPost.IndexOf(_parseNameTo, pos1)
786                    lItem.Name = HttpUtility.HtmlDecode(strPost.Substring(pos1 + _parseName.Length, pos2 - pos1 - _parseName.Length))
787                Catch ex As Exception
788                    _signed = False
789                    Return "GetDirectMessage -> Err: Can't get Name"
790                End Try
791
792                'Get Nick
793                'pos1 = strPost.IndexOf(_parseNick, pos2)
794                'pos2 = strPost.IndexOf("""", pos1 + _parseNick.Length)
795                'lItem.Nick = HttpUtility.HtmlDecode(strPost.Substring(pos1 + _parseNick.Length, pos2 - pos1 - _parseNick.Length))
796                lItem.Nick = lItem.Name
797
798                If links.Contains(lItem.Id) Then
799                    flg = True
800                End If
801
802                If flg = False Then
803                    'Get ImagePath
804                    Try
805                        pos1 = strPost.IndexOf(_parseImg, pos2)
806                        pos2 = strPost.IndexOf(_parseImgTo, pos1 + _parseImg.Length)
807                        lItem.ImageUrl = HttpUtility.HtmlDecode(strPost.Substring(pos1 + _parseImg.Length, pos2 - pos1 - _parseImg.Length))
808                    Catch ex As Exception
809                        _signed = False
810                        Return "GetDirectMessage -> Err: Can't get ImagePath"
811                    End Try
812
813                    'Get Message
814                    Try
815                        pos1 = strPost.IndexOf(_parseDM1, pos2)
816                        pos2 = strPost.IndexOf(_parseDM2, pos1)
817                        orgData = strPost.Substring(pos1 + _parseDM1.Length, pos2 - pos1 - _parseDM1.Length).Trim()
818                        orgData = orgData.Replace("&lt;3", "♡")
819                    Catch ex As Exception
820                        _signed = False
821                        Return "GetDirectMessage -> Err: Can't get body"
822                    End Try
823
824                    'lItem.OrgData = "<font size=""2"">" + orgData + "</ font>"
825                    Dim posl1 As Integer
826                    Dim posl2 As Integer = 0
827                    Dim posl3 As Integer
828
829                    If _tinyUrlResolve Then
830                        Try
831                            Do While True
832                                If orgData.IndexOf("<a href=""http://tinyurl.com/", posl2) > -1 Then
833                                    Dim urlStr As String
834                                    posl1 = orgData.IndexOf("<a href=""http://tinyurl.com/", posl2)
835                                    posl1 = orgData.IndexOf("http://tinyurl.com/", posl1)
836                                    posl2 = orgData.IndexOf("""", posl1)
837                                    urlStr = orgData.Substring(posl1, posl2 - posl1)
838                                    Dim Response As String = ""
839                                    Dim retUrlStr As String = ""
840                                    retUrlStr = DirectCast(_mySock.GetWebResponse(urlStr, Response, MySocket.REQ_TYPE.ReqGETForwardTo), String)
841                                    If retUrlStr.Length > 0 Then
842                                        orgData = orgData.Replace("<a href=""" + urlStr, "<a href=""" + retUrlStr)
843                                    End If
844                                Else
845                                    Exit Do
846                                End If
847                            Loop
848                        Catch ex As Exception
849                            _signed = False
850                            Return "GetDirectMessage -> Err: Can't parse tinyurl"
851                        End Try
852                    End If
853
854                    lItem.OrgData = orgData
855                    lItem.OrgData = lItem.OrgData.Replace("<a href=""/", "<a href=""https://twitter.com/")
856                    lItem.OrgData = lItem.OrgData.Replace("<a href=", "<a target=""_self"" href=")
857                    lItem.OrgData = lItem.OrgData.Replace(vbLf, "<br>")
858                    'lItem.OrgData = HttpUtility.HtmlDecode(lItem.OrgData)
859
860                    'Dim LinkCol As New List(Of MyLinks)
861
862                    Try
863                        If orgData.IndexOf(_parseLink1) = -1 Then
864                            lItem.Data = HttpUtility.HtmlDecode(orgData)
865                        Else
866                            lItem.Data = ""
867                            'posl1 = orgData.IndexOf(_parseLink1)
868
869                            posl3 = 0
870                            Do While True
871                                'Dim _myLink As New MyLinks
872                                'Dim tmpLink As String
873
874                                posl1 = orgData.IndexOf(_parseLink1, posl3)
875                                If posl1 = -1 Then Exit Do
876
877                                If (posl3 + _parseLink3.Length <> posl1) Or posl3 = 0 Then
878                                    If posl3 <> 0 Then
879                                        lItem.Data += HttpUtility.HtmlDecode(orgData.Substring(posl3 + _parseLink3.Length, posl1 - posl3 - _parseLink3.Length))
880                                    Else
881                                        lItem.Data += HttpUtility.HtmlDecode(orgData.Substring(0, posl1))
882                                    End If
883                                End If
884                                posl2 = orgData.IndexOf(_parseLink2, posl1)
885                                posl3 = orgData.IndexOf(_parseLink3, posl2)
886                                '_myLink.StartIndex = lItem.Data.Length
887                                'tmpLink = HttpUtility.HtmlDecode(orgData.Substring(posl2 + _parseLink2.Length, posl3 - posl2 - _parseLink2.Length))
888                                lItem.Data += HttpUtility.HtmlDecode(orgData.Substring(posl2 + _parseLink2.Length, posl3 - posl2 - _parseLink2.Length))
889                                '_myLink.Length = tmpLink.Length
890                                '_myLink.UrlString = orgData.Substring(posl1 + _parseLink1.Length, posl2 - posl1 - _parseLink1.Length)
891                                'If _myLink.UrlString.IndexOf(_IsHTTP) = -1 Then
892                                '    _myLink.UrlString = "http://" + _hubServer + _myLink.UrlString
893                                'End If
894                                'If _myLink.UrlString.IndexOf("""") >= 0 Then
895                                '    _myLink.UrlString = _myLink.UrlString.Substring(0, _myLink.UrlString.IndexOf(""""))
896                                'End If
897                                'LinkCol.Add(_myLink)
898                            Loop
899
900
901                            lItem.Data += HttpUtility.HtmlDecode(orgData.Substring(posl3 + _parseLink3.Length))
902                        End If
903                    Catch ex As Exception
904                        _signed = False
905                        Return "GetDirectMessage -> Err: Can't parse links"
906                    End Try
907
908                    ''Get Date
909                    ''pos1 = strPost.IndexOf(_parseDate, pos2)
910                    ''pos2 = strPost.IndexOf("""", pos1 + _parseDate.Length)
911                    ''lItem.PDate = DateTime.ParseExact(strPost.Substring(pos1 + _parseDate.Length, pos2 - pos1 - _parseDate.Length), "yyyy'-'MM'-'dd'T'HH':'mm':'sszzz", System.Globalization.DateTimeFormatInfo.InvariantInfo, Globalization.DateTimeStyles.None)
912                    'lItem.PDate = Now()
913                    'Get Date
914                    pos1 = strPost.IndexOf(_parseDate, pos2)
915                    If pos1 > -1 Then
916                        Try
917                            pos2 = strPost.IndexOf(_parseDateTo, pos1 + _parseDate.Length)
918                            lItem.PDate = DateTime.ParseExact(strPost.Substring(pos1 + _parseDate.Length, pos2 - pos1 - _parseDate.Length), "yyyy'-'MM'-'dd'T'HH':'mm':'sszzz", System.Globalization.DateTimeFormatInfo.InvariantInfo, Globalization.DateTimeStyles.None)
919                            tmpDate = lItem.PDate
920                        Catch ex As Exception
921                            _signed = False
922                            Return "GetTimeline -> Err: Can't get date."
923                        End Try
924                    Else
925                        lItem.PDate = tmpDate
926                    End If
927
928
929                    'Get Fav
930                    'pos1 = strPost.IndexOf(_parseStar, pos2)
931                    'pos2 = strPost.IndexOf("""", pos1 + _parseStar.Length)
932                    'If strPost.Substring(pos1 + _parseStar.Length, pos2 - pos1 - _parseStar.Length) = "empty" Then
933                    '    lItem.Fav = False
934                    'Else
935                    '    lItem.Fav = True
936                    'End If
937                    lItem.Fav = False
938
939                    'Imageの取得
940                    '''If imgKeys.Contains(lItem.ImageUrl) = False Then
941                    '''    imgKeys.Add(lItem.ImageUrl)
942                    '''    ar(intCnt) = _threadGetIcon.BeginInvoke(lItem.ImageUrl, Nothing, Nothing)
943                    '''    'retMsg = GetIconImage(lItem.ImageUrl, TIconList, TIconSmallList)
944                    '''    'If retMsg.Length > 0 Then
945                    '''    '    Return retMsg
946                    '''    'End If
947                    '''End If
948                    If imgKeys.Contains(lItem.ImageUrl) = False Then
949                        GetIconImage(lItem.ImageUrl, imgKeys, imgs)
950                    End If
951
952                    If _endingFlag Then Return ""
953
954                    'links.Add(lItem.Name + "_" + lItem.Id, LinkCol)
955                    links.Add(lItem.Id)
956                    tLine.Add(lItem)
957                End If
958            End If
959        Next
960
961        '''For intCnt = 1 To ar.Length - 1
962        '''    If Not ar(intCnt) Is Nothing Then
963        '''        Do While ar(intCnt).IsCompleted = False
964        '''            System.Threading.Thread.Sleep(500)
965        '''        Loop
966        '''    End If
967        '''Next
968
969        Dim getCnt As Integer
970
971        getCnt = tLine.Count - listCnt
972        If getCnt = 20 Then
973            '            If strPost.IndexOf(_linkToOld) > -1 Then
974            '*** 別スレッドで動かす
975            'retMsg = GetDirectMessage(tLine, page + 1, endPage)
976            'If retMsg.Length > 0 Then
977            '    Return retMsg
978            'End If
979            '        End If
980            endPage += 1
981        End If
982
983        Return ""
984    End Function
985
986    Public Function SetOldTimeline(ByVal tLine As List(Of MyListItem), ByVal tLine2 As List(Of MyListItem)) As String
987        '''    Dim orgData As String = ""
988        '''    '        Dim retMsg As String
989        '''    Dim imgKeys As Collections.Specialized.StringCollection = TIconList.Images.Keys
990
991        '''    _threadGetIcon = New ThreadGetIcon(AddressOf GetIconImage)
992        '''    Dim ar(tLine.Count - 1) As IAsyncResult
993        '''    Dim cnt As Integer = 0
994
995        '''    For cnt = 0 To tLine.Count - 1
996        '''        Dim lItem As New MyListItem
997        '''        ar(cnt) = Nothing
998        '''        lItem.Data = tLine(cnt).Data
999        '''        lItem.Fav = tLine(cnt).Fav
1000        '''        lItem.Id = tLine(cnt).Id
1001        '''        lItem.ImageUrl = tLine(cnt).ImageUrl
1002        '''        lItem.Name = tLine(cnt).Name
1003        '''        lItem.Nick = tLine(cnt).Nick
1004        '''        lItem.OrgData = tLine(cnt).OrgData
1005        '''        lItem.PDate = tLine(cnt).PDate
1006        '''        lItem.Unread = tLine(cnt).Unread
1007
1008        '''        'Get Message
1009        '''        orgData = lItem.OrgData.Replace("<a target=""_self""", "<a")
1010
1011        '''        Dim posl1 As Integer
1012        '''        Dim posl2 As Integer
1013        '''        Dim posl3 As Integer
1014        '''        'Dim LinkCol As New List(Of MyLinks)
1015
1016        '''        If orgData.IndexOf(_parseLink1) = -1 Then
1017        '''            lItem.Data = orgData
1018        '''        Else
1019        '''            lItem.Data = ""
1020        '''            posl1 = orgData.IndexOf(_parseLink1)
1021
1022        '''            posl3 = 0
1023        '''            Do While True
1024        '''                'Dim _myLink As New MyLinks
1025        '''                'Dim tmpLink As String
1026
1027        '''                posl1 = orgData.IndexOf(_parseLink1, posl3)
1028        '''                If posl1 = -1 Then Exit Do
1029
1030        '''                If posl3 + _parseLink3.Length <> posl1 Or posl3 = 0 Then
1031        '''                    If posl3 <> 0 Then
1032        '''                        lItem.Data += HttpUtility.HtmlDecode(orgData.Substring(posl3 + _parseLink3.Length, posl1 - posl3 - _parseLink3.Length))
1033        '''                    Else
1034        '''                        lItem.Data += HttpUtility.HtmlDecode(orgData.Substring(0, posl1))
1035        '''                    End If
1036        '''                End If
1037        '''                posl2 = orgData.IndexOf(_parseLink2, posl1)
1038        '''                posl3 = orgData.IndexOf(_parseLink3, posl2)
1039        '''                '_myLink.StartIndex = lItem.Data.Length
1040        '''                'tmpLink = HttpUtility.HtmlDecode(orgData.Substring(posl2 + _parseLink2.Length, posl3 - posl2 - _parseLink2.Length))
1041        '''                lItem.Data += HttpUtility.HtmlDecode(orgData.Substring(posl2 + _parseLink2.Length, posl3 - posl2 - _parseLink2.Length))
1042        '''                '_myLink.Length = tmpLink.Length
1043        '''                '_myLink.UrlString = orgData.Substring(posl1 + _parseLink1.Length, posl2 - posl1 - _parseLink1.Length)
1044        '''                'If _myLink.UrlString.IndexOf(_IsHTTP) = -1 Then
1045        '''                '    _myLink.UrlString = "http://" + _hubServer + _myLink.UrlString
1046        '''                'End If
1047        '''                'If _myLink.UrlString.IndexOf("""") >= 0 Then
1048        '''                '    _myLink.UrlString = _myLink.UrlString.Substring(0, _myLink.UrlString.IndexOf(""""))
1049        '''                'End If
1050        '''                'LinkCol.Add(_myLink)
1051        '''            Loop
1052
1053        '''            lItem.Data += HttpUtility.HtmlDecode(orgData.Substring(posl3 + _parseLink3.Length))
1054        '''        End If
1055
1056        '''        'Imageの取得
1057        '''        If imgKeys.Contains(lItem.ImageUrl) = False Then
1058        '''            imgKeys.Add(lItem.ImageUrl)
1059        '''            ar(cnt) = _threadGetIcon.BeginInvoke(lItem.ImageUrl, Nothing, Nothing)
1060        '''            'retMsg = GetIconImage(lItem.ImageUrl, TIconList, TIconSmallList)
1061        '''            'If retMsg.Length > 0 Then
1062        '''            '    Return retMsg
1063        '''            'End If
1064        '''        End If
1065
1066        '''        links.Add(lItem.Name + "_" + lItem.Id)
1067        '''        tLine2.Add(lItem)
1068        '''    Next
1069
1070        '''    For cnt = 0 To ar.Length - 1
1071        '''        If Not ar(cnt) Is Nothing Then
1072        '''            Do While ar(cnt).IsCompleted = False
1073        '''                System.Threading.Thread.Sleep(500)
1074        '''            Loop
1075        '''        End If
1076        '''    Next
1077
1078        Return ""
1079    End Function
1080
1081    Private Sub GetIconImage(ByVal pathUrl As String, ByVal imgKeys As Collections.Specialized.StringCollection, ByVal imgs As ImageList)
1082        If _endingFlag Then Exit Sub
1083        If _getIcon = False Then Exit Sub
1084
1085        'Dim pathUrlSmall As String = pathUrl.Replace("_normal.", "_mini.")
1086        Dim resStatus As String = ""
1087        '''Dim mySock = New MySocket("UTF-8")
1088        Dim img As Image = Nothing
1089        Dim cnt As Integer = 1
1090
1091        '''img = mySock.GetWebResponse(pathUrl, resStatus, MySocket.REQ_TYPE.ReqGETBinary)
1092        img = DirectCast(_mySock.GetWebResponse(pathUrl, resStatus, MySocket.REQ_TYPE.ReqGETBinary), System.Drawing.Image)
1093        If Not img Is Nothing Then
1094            '''SyncLock TIconList
1095            imgKeys.Add(pathUrl)
1096            imgs.Images.Add(pathUrl, img)
1097            'img.Dispose()
1098            'img = Nothing
1099            '''End SyncLock
1100            'Exit Do
1101        Else
1102            'If cnt > 10 Then Exit Sub
1103            'Threading.Thread.Sleep(200)
1104            Exit Sub
1105        End If
1106
1107
1108        ''Dim img2 As Image = mySock.GetWebResponse(pathUrlSmall, resStatus, MySocket.REQ_TYPE.ReqGETBinary)
1109
1110        ''If img2 Is Nothing Then
1111        ''    SyncLock TIconList
1112        ''        TIconList.Images.RemoveByKey(pathUrl)
1113        ''    End SyncLock
1114        ''Else
1115        ''If _iconSz <> 48 Then
1116        'If _iconSz <> 0 Then
1117        '    Dim img2 As New Bitmap(_iconSz, _iconSz)
1118        '    Dim g As Graphics = Graphics.FromImage(img2)
1119        '    g.InterpolationMode = Drawing2D.InterpolationMode.Default
1120        '    g.DrawImage(img, 0, 0, _iconSz, _iconSz)
1121        '    '''SyncLock TIconSmallList
1122        '    TIconSmallList.Images.Add(pathUrl, img2)
1123        '    '''End SyncLock
1124        'End If
1125        ''Else
1126        ''    Dim img2 As Image = img.Clone
1127        ''    '''SyncLock TIconSmallList
1128        ''    TIconSmallList.Images.Add(pathUrl, img2)
1129        ''    '''End SyncLock
1130        ''End If
1131        ''End If
1132        ''''mySock = Nothing
1133    End Sub
1134
1135    Private Function GetAuthKey(ByVal resMsg As String) As Integer
1136        Dim pos1 As Integer
1137        Dim pos2 As Integer
1138
1139        pos1 = resMsg.IndexOf(_getAuthKey)
1140        If pos1 < 0 Then
1141            'データ不正?
1142            Return -7
1143        End If
1144        pos2 = resMsg.IndexOf(_getAuthKeyTo, pos1 + _getAuthKey.Length)
1145        If pos2 > -1 Then
1146            _authKey = resMsg.Substring(pos1 + _getAuthKey.Length, pos2 - pos1 - _getAuthKey.Length)
1147        Else
1148            Return -7
1149        End If
1150
1151        Return 0
1152    End Function
1153
1154    Private Function GetAuthKeyDM(ByVal resMsg As String) As Integer
1155        Dim pos1 As Integer
1156        Dim pos2 As Integer
1157
1158        pos1 = resMsg.IndexOf(_getAuthKey)
1159        If pos1 < 0 Then
1160            'データ不正?
1161            Return -7
1162        End If
1163        pos2 = resMsg.IndexOf("""", pos1 + _getAuthKey.Length)
1164        _authKeyDM = resMsg.Substring(pos1 + _getAuthKey.Length, pos2 - pos1 - _getAuthKey.Length)
1165
1166        Return 0
1167    End Function
1168
1169    Public Function PostStatus(ByVal postStr As String, ByVal reply_to As Integer) As String
1170        '140文字まで。Byteで計算する必要有?
1171        'If postStr.Length > 140 Then
1172        '    Return "PostStatus -> Err: 文字数オーバー"
1173        'End If
1174
1175        If _endingFlag Then Return ""
1176
1177        postStr = postStr.Trim()
1178
1179        'If _useAPI = False Then
1180        ''データ部分の生成
1181        'Dim dataStr As String = _authKeyHeader + HttpUtility.UrlEncode(_authKey) + "&" + _authKeyHeader + HttpUtility.UrlEncode(_authKey) + "&siv=" + HttpUtility.UrlEncode(_authSiv) + "&" + _statusHeader + HttpUtility.UrlEncode(postStr)
1182        'Dim resStatus As String = ""
1183        'Dim resMsg As String = _mySock.GetWebResponse("https://" + _hubServer + _statusUpdatePath, resStatus, MySocket.REQ_TYPE.ReqPOSTEncodeProtoVer1, dataStr)
1184
1185        'If resStatus.StartsWith("OK") Then
1186        '    If postStr.Trim.StartsWith("D ") = False Then
1187        '        If resMsg.StartsWith("new Insertion.Top") = False Then
1188        '            If resMsg.Contains("<p>") And resMsg.Contains("<\/p>") Then
1189        '                Dim pos1 As Integer = resMsg.IndexOf("<p>", 0)
1190        '                Dim pos2 As Integer = resMsg.IndexOf("<\/p>")
1191        '                resMsg = resMsg.Substring(pos1 + 3, pos2 - pos1 - 3)
1192        '                resMsg = HttpUtility.UrlDecode(resMsg.Replace("\u", "%u"))
1193        '                If resMsg.Contains("140") Then
1194        '                    resStatus = ""
1195        '                Else
1196        '                    resStatus = resMsg
1197        '                End If
1198        '            Else
1199        '                resStatus = ""
1200        '            End If
1201        '        Else
1202        '            resStatus = ""
1203        '        End If
1204        '    Else
1205        '        If resMsg.Contains("<p>") And resMsg.Contains("<\/p>") Then
1206        '            Dim pos1 As Integer = resMsg.IndexOf("<p>", 0)
1207        '            Dim pos2 As Integer = resMsg.IndexOf("<\/p>")
1208        '            resMsg = resMsg.Substring(pos1 + 3, pos2 - pos1 - 3)
1209        '            resMsg = HttpUtility.UrlDecode(resMsg.Replace("\u", "%u"))
1210        '            If resMsg = "Your direct message has been sent." Or resMsg = "ダイレクトメッセージを送信しました。" Then
1211        '                resStatus = ""
1212        '            Else
1213        '                resStatus = resMsg
1214        '            End If
1215        '        End If
1216        '    End If
1217        'End If
1218
1219        'Return resStatus
1220        'Else
1221        'データ部分の生成
1222        Dim dataStr As String
1223        If reply_to = 0 Then
1224            dataStr = _statusHeader + HttpUtility.UrlEncode(postStr) + "&source=Tween"
1225        Else
1226            dataStr = _statusHeader + HttpUtility.UrlEncode(postStr) + "&source=Tween" + "&in_reply_to_status_id=" + HttpUtility.UrlEncode(reply_to.ToString)
1227        End If
1228
1229        Dim resStatus As String = ""
1230        Dim resMsg As String = DirectCast(_mySock.GetWebResponse("https://" + _hubServer + _statusUpdatePathAPI, resStatus, MySocket.REQ_TYPE.ReqPOSTAPI, dataStr), String)
1231
1232        If resStatus.StartsWith("OK") Then
1233            Return ""
1234        Else
1235            Return resStatus
1236        End If
1237        'End If
1238
1239        ''********************** POST失敗時応答判定 ***********************
1240        ''DM送信
1241        'If resMsg.IndexOf("Can't find that person") > -1 Then
1242        '    Return "PostStatus -> Err: DM宛先間違い"
1243        'End If
1244        ''*****************************************************************
1245    End Function
1246
1247    Public Function RemoveStatus(ByVal id As String) As String
1248        If _endingFlag Then Return ""
1249
1250        'データ部分の生成
1251        'Dim dataStr As String = "_method=delete&" + _authKeyHeader + HttpUtility.UrlEncode(_authKey)
1252        Dim dataStr As String = _authKeyHeader + HttpUtility.UrlEncode(_authKey)
1253        Dim resStatus As String = ""
1254        Dim resMsg As String = DirectCast(_mySock.GetWebResponse("https://" + _hubServer + _StDestroyPath + id, resStatus, MySocket.REQ_TYPE.ReqPOSTEncode, dataStr, "https://" + _baseUrlStr + _homePath), String)
1255
1256        If resMsg.StartsWith("<html>") = False Then
1257            Return resStatus
1258        End If
1259
1260        '********************** POST失敗時応答判定 ***********************
1261        '*****************************************************************
1262
1263        Return ""
1264    End Function
1265
1266    Public Function RemoveDirectMessage(ByVal id As String) As String
1267        If _endingFlag Then Return ""
1268
1269        'データ部分の生成
1270        Dim dataStr As String = _authKeyHeader + HttpUtility.UrlEncode(_authKey)
1271        Dim resStatus As String = ""
1272        Dim resMsg As String = DirectCast(_mySock.GetWebResponse("https://" + _hubServer + _DMDestroyPath + id, resStatus, MySocket.REQ_TYPE.ReqPOST, dataStr), String)
1273
1274        If resMsg.StartsWith("<html>") = False Then
1275            Return resStatus
1276        End If
1277
1278        '********************** GET失敗時応答判定 ***********************
1279        '*****************************************************************
1280
1281        Return ""
1282    End Function
1283
1284    Public Function PostFavAdd(ByVal id As String) As String
1285        If _endingFlag Then Return ""
1286
1287        'データ部分の生成
1288        Dim dataStr As String = _authKeyHeader + HttpUtility.UrlEncode(_authKey)
1289        Dim resStatus As String = ""
1290        Dim resMsg As String = DirectCast(_mySock.GetWebResponse("https://" + _hubServer + _postFavAddPath + id, resStatus, MySocket.REQ_TYPE.ReqPOSTEncodeProtoVer2, dataStr), String)
1291
1292        'If resMsg.StartsWith("$") = False Then
1293        If resMsg.StartsWith("$") = False And resMsg <> " " Then
1294            Return resStatus
1295        End If
1296
1297        '********************** POST失敗時判定 ***********************
1298        '*************************************************************
1299
1300        If _restrictFavCheck = False Then Return ""
1301
1302        'http://twitter.com/statuses/show/id.xml APIを発行して本文を取得
1303
1304        resMsg = DirectCast(_mySock.GetWebResponse("https://" + _hubServer + _ShowStatus + id + ".xml", resStatus, MySocket.REQ_TYPE.ReqPOSTEncodeProtoVer2), String)
1305
1306        Dim rd As Xml.XmlTextReader = New Xml.XmlTextReader(New System.IO.StringReader(resMsg))
1307
1308        rd.Read()
1309        While rd.EOF = False
1310            If rd.IsStartElement("favorited") Then
1311                If rd.ReadElementContentAsBoolean() = True Then
1312                    Return ""  '正常にふぁぼれている
1313                Else
1314                    Return "NG(Restricted?)"  '正常応答なのにふぁぼれてないので制限っぽい
1315                End If
1316            Else
1317                rd.Read()
1318            End If
1319        End While
1320        rd.Close()
1321
1322        Return ""
1323    End Function
1324
1325    Public Function PostFavRemove(ByVal id As String) As String
1326        If _endingFlag Then Return ""
1327
1328        'データ部分の生成
1329        Dim dataStr As String = _authKeyHeader + HttpUtility.UrlEncode(_authKey)
1330        Dim resStatus As String = ""
1331        Dim resMsg As String = DirectCast(_mySock.GetWebResponse("https://" + _hubServer + _postFavRemovePath + id, resStatus, MySocket.REQ_TYPE.ReqPOSTEncodeProtoVer2, dataStr), String)
1332
1333        'If resMsg.StartsWith("$") = False Then
1334        If resMsg.StartsWith("$") = False And resMsg <> " " Then
1335            Return resStatus
1336        End If
1337
1338        '********************** POST失敗時判定 ***********************
1339        '*************************************************************
1340
1341        Return ""
1342    End Function
1343
1344    Public Function GetFollowers() As String
1345        Dim resStatus As String = ""
1346        Dim resMsg As String = ""
1347        Dim i As Integer = 0
1348
1349        follower.Clear()
1350        follower.Add(_uid)
1351        Do While True
1352            i += 1
1353            ' resMsg = _mySock.GetWebResponse("https://" + _hubServer + _GetFollowers + "?page=" + i.ToString, resStatus, MySocket.REQ_TYPE.ReqGetAPI)
1354            resMsg = DirectCast(_mySock.GetWebResponse("https://" + _hubServer + _GetFollowers + _pageQry + i.ToString, resStatus, MySocket.REQ_TYPE.ReqPOSTAPI), String)
1355            If resStatus.StartsWith("OK") = False Then
1356                follower.Clear()
1357                follower.Add(_uid)  '途中で失敗したら片思い表示しない
1358                Return resStatus
1359            End If
1360
1361            Dim rd As Xml.XmlTextReader = New Xml.XmlTextReader(New System.IO.StringReader(resMsg))
1362            Dim lc As Integer = 0
1363
1364            rd.Read()
1365            While rd.EOF = False
1366                If rd.IsStartElement("screen_name") Then
1367                    follower.Add(rd.ReadElementString("screen_name"))
1368                    lc += 1
1369                Else
1370                    rd.Read()
1371                End If
1372            End While
1373            rd.Close()
1374
1375            If lc = 0 Then Exit Do
1376        Loop
1377
1378        Return ""
1379    End Function
1380
1381    Public Property Username() As String
1382        Get
1383            Return _uid
1384        End Get
1385        Set(ByVal value As String)
1386            _uid = value
1387            _mySock.Username = _uid
1388        End Set
1389    End Property
1390
1391    Public Property Password() As String
1392        Get
1393            Return _pwd
1394        End Get
1395        Set(ByVal value As String)
1396            _pwd = value
1397            _mySock.Password = _pwd
1398            _mySock.CreateCredentialInfo()
1399        End Set
1400    End Property
1401
1402    'Public Property LastID() As String
1403    '    Get
1404    '        Return _lastId
1405    '    End Get
1406    '    Set(ByVal value As String)
1407    '        _lastId = value
1408    '    End Set
1409    'End Property
1410
1411    'Public Property LastName() As String
1412    '    Get
1413    '        Return _lastName
1414    '    End Get
1415    '    Set(ByVal value As String)
1416    '        _lastName = value
1417    '    End Set
1418    'End Property
1419
1420    Public Property NextThreshold() As Integer
1421        Get
1422            Return _nextThreshold
1423        End Get
1424        Set(ByVal value As Integer)
1425            _nextThreshold = value
1426        End Set
1427    End Property
1428
1429    Public Property NextPages() As Integer
1430        Get
1431            Return _nextPages
1432        End Get
1433        Set(ByVal value As Integer)
1434            _nextPages = value
1435        End Set
1436    End Property
1437
1438    'Public Property IconSize() As Integer
1439    '    Get
1440    '        Return _iconSz
1441    '    End Get
1442    '    Set(ByVal value As Integer)
1443    '        _iconSz = value
1444    '    End Set
1445    'End Property
1446
1447    Public Property Ending() As Boolean
1448        Get
1449            Return _endingFlag
1450        End Get
1451        Set(ByVal value As Boolean)
1452            _endingFlag = value
1453        End Set
1454    End Property
1455
1456    Public ReadOnly Property InfoTwitter() As String
1457        Get
1458            Return _infoTwitter
1459        End Get
1460    End Property
1461
1462    Public Property UseAPI() As Boolean
1463        Get
1464            Return _useAPI
1465        End Get
1466        Set(ByVal value As Boolean)
1467            _useAPI = value
1468        End Set
1469    End Property
1470
1471    Public Property HubServer() As String
1472        Get
1473            Return _hubServer
1474        End Get
1475        Set(ByVal value As String)
1476            _hubServer = value
1477        End Set
1478    End Property
1479
1480    Public Sub GetWedata()
1481        Dim resStatus As String = ""
1482        Dim resMsg As String = ""
1483
1484        resMsg = DirectCast(_mySock.GetWebResponse(wedataUrl, resStatus, timeout:=10 * 1000), String) 'タイムアウト時間を10秒に設定
1485        If resMsg.Length = 0 Then Exit Sub
1486
1487        Dim rs As New System.IO.StringReader(resMsg)
1488
1489        'StreamReaderを使うと次のようになる
1490        'Dim ms As New System.IO.MemoryStream( _
1491        '    System.Text.Encoding.UTF8.GetBytes(TextBox1.Text))
1492        'Dim rs As New System.IO.StreamReader(ms)
1493
1494        Dim mode As Integer = 0 '0:search name 1:search data 2:read data
1495        Dim name As String = ""
1496
1497        'ストリームの末端まで繰り返す
1498        Dim ln As String
1499        While rs.Peek() > -1
1500            ln = rs.ReadLine
1501
1502            Select Case mode
1503                Case 0
1504                    If ln.StartsWith("    ""name"": ") Then
1505                        name = ln.Substring(13, ln.Length - 2 - 13)
1506                        mode += 1
1507                    End If
1508                Case 1
1509                    If ln = "    ""data"": {" Then
1510                        mode += 1
1511                    End If
1512                Case 2
1513                    If ln = "    }," Then
1514                        mode = 0
1515                    Else
1516                        If ln.EndsWith(",") Then ln = ln.Substring(0, ln.Length - 1)
1517                        Select Case name
1518                            Case "SplitPostReply"
1519                                If ln.StartsWith("      ""tagfrom"": """) Then
1520                                    _splitPost = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1521                                End If
1522                            Case "SplitPostRecent"
1523                                If ln.StartsWith("      ""tagfrom"": """) Then
1524                                    _splitPostRecent = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1525                                End If
1526                            Case "StatusID"
1527                                If ln.StartsWith("      ""tagto"": """) Then
1528                                    _statusIdTo = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1529                                End If
1530                            Case "IsProtect"
1531                                If ln.StartsWith("      ""tagfrom"": """) Then
1532                                    _isProtect = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1533                                End If
1534                            Case "IsReply"
1535                                If ln.StartsWith("      ""tagfrom"": """) Then
1536                                    _isReplyEng = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1537                                End If
1538                                If ln.StartsWith("      ""tagfrom2"": """) Then
1539                                    _isReplyJpn = ln.Substring(19, ln.Length - 1 - 19).Replace("\", "")
1540                                End If
1541                                If ln.StartsWith("      ""tagto"": """) Then
1542                                    _isReplyTo = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1543                                End If
1544                            Case "GetStar"
1545                                If ln.StartsWith("      ""tagfrom"": """) Then
1546                                    _parseStar = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1547                                End If
1548                                If ln.StartsWith("      ""tagfrom2"": """) Then
1549                                    _parseStarEmpty = ln.Substring(19, ln.Length - 1 - 19).Replace("\", "")
1550                                End If
1551                                If ln.StartsWith("      ""tagto"": """) Then
1552                                    _parseStarTo = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1553                                End If
1554                            Case "Follower"
1555                                If ln.StartsWith("      ""tagfrom"": """) Then
1556                                    _followerList = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1557                                End If
1558                                If ln.StartsWith("      ""tagfrom2"": """) Then
1559                                    _followerMbr1 = ln.Substring(19, ln.Length - 1 - 19).Replace("\", "")
1560                                End If
1561                                If ln.StartsWith("      ""tagfrom3"": """) Then
1562                                    _followerMbr2 = ln.Substring(19, ln.Length - 1 - 19).Replace("\", "")
1563                                End If
1564                                If ln.StartsWith("      ""tagto"": """) Then
1565                                    _followerMbr3 = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1566                                End If
1567                            Case "SplitDM"
1568                                If ln.StartsWith("      ""tagfrom"": """) Then
1569                                    _splitDM = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1570                                End If
1571                            Case "GetMsgDM"
1572                                If ln.StartsWith("      ""tagfrom"": """) Then
1573                                    _parseDM1 = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1574                                End If
1575                                If ln.StartsWith("      ""tagto"": """) Then
1576                                    _parseDM2 = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1577                                End If
1578                            Case "GetDate"
1579                                If ln.StartsWith("      ""tagfrom"": """) Then
1580                                    _parseDate = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1581                                End If
1582                                If ln.StartsWith("      ""tagto"": """) Then
1583                                    _parseDateTo = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1584                                End If
1585                            Case "GetMsg"
1586                                If ln.StartsWith("      ""tagfrom"": """) Then
1587                                    _parseMsg1 = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1588                                End If
1589                                If ln.StartsWith("      ""tagto"": """) Then
1590                                    _parseMsg2 = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1591                                End If
1592                            Case "GetImagePath"
1593                                If ln.StartsWith("      ""tagfrom"": """) Then
1594                                    _parseImg = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1595                                End If
1596                                If ln.StartsWith("      ""tagto"": """) Then
1597                                    _parseImgTo = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1598                                End If
1599                            Case "GetNick"
1600                                If ln.StartsWith("      ""tagfrom"": """) Then
1601                                    _parseNick = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1602                                End If
1603                                If ln.StartsWith("      ""tagto"": """) Then
1604                                    _parseNickTo = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1605                                End If
1606                            Case "GetName"
1607                                If ln.StartsWith("      ""tagfrom"": """) Then
1608                                    _parseName = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1609                                End If
1610                                If ln.StartsWith("      ""tagto"": """) Then
1611                                    _parseNameTo = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1612                                End If
1613                                'Case "GetSiv"
1614                                '    If ln.StartsWith("      ""tagfrom"": """) Then
1615                                '        _getSiv = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1616                                '    End If
1617                                '    If ln.StartsWith("      ""tagto"": """) Then
1618                                '        _getSivTo = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1619                                '    End If
1620                            Case "AuthKey"
1621                                If ln.StartsWith("      ""tagfrom"": """) Then
1622                                    _getAuthKey = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1623                                End If
1624                                If ln.StartsWith("      ""tagto"": """) Then
1625                                    _getAuthKeyTo = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1626                                End If
1627                            Case "InfoTwitter"
1628                                If ln.StartsWith("      ""tagfrom"": """) Then
1629                                    _getInfoTwitter = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1630                                End If
1631                                If ln.StartsWith("      ""tagto"": """) Then
1632                                    _getInfoTwitterTo = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1633                                End If
1634                            Case "GetProtectMsg"
1635                                If ln.StartsWith("      ""tagfrom"": """) Then
1636                                    _parseProtectMsg1 = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1637                                End If
1638                                If ln.StartsWith("      ""tagto"": """) Then
1639                                    _parseProtectMsg2 = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1640                                End If
1641                            Case "GetDMCount"
1642                                If ln.StartsWith("      ""tagfrom"": """) Then
1643                                    _parseDMcountFrom = ln.Substring(18, ln.Length - 1 - 18).Replace("\", "")
1644                                End If
1645                                If ln.StartsWith("      ""tagto"": """) Then
1646                                    _parseDMcountTo = ln.Substring(16, ln.Length - 1 - 16).Replace("\", "")
1647                                End If
1648                        End Select
1649                    End If
1650            End Select
1651        End While
1652
1653        rs.Close()
1654
1655#If DEBUG Then
1656        GenerateAnalyzeKey()
1657#End If
1658    End Sub
1659
1660    Public WriteOnly Property GetIcon() As Boolean
1661        Set(ByVal value As Boolean)
1662            _getIcon = value
1663        End Set
1664    End Property
1665
1666    Public WriteOnly Property TinyUrlResolve() As Boolean
1667        Set(ByVal value As Boolean)
1668            _tinyUrlResolve = value
1669        End Set
1670    End Property
1671
1672    Public WriteOnly Property ProxyType() As ProxyTypeEnum
1673        Set(ByVal value As ProxyTypeEnum)
1674            _proxyType = value
1675        End Set
1676    End Property
1677
1678    Public WriteOnly Property ProxyAddress() As String
1679        Set(ByVal value As String)
1680            _proxyAddress = value
1681        End Set
1682    End Property
1683
1684    Public WriteOnly Property ProxyPort() As Integer
1685        Set(ByVal value As Integer)
1686            _proxyPort = value
1687        End Set
1688    End Property
1689
1690    Public WriteOnly Property ProxyUser() As String
1691        Set(ByVal value As String)
1692            _proxyUser = value
1693        End Set
1694    End Property
1695
1696    Public WriteOnly Property ProxyPassword() As String
1697        Set(ByVal value As String)
1698            _proxyPassword = value
1699        End Set
1700    End Property
1701
1702    Public WriteOnly Property RestrictFavCheck() As Boolean
1703        Set(ByVal value As Boolean)
1704            _restrictFavCheck = value
1705        End Set
1706    End Property
1707    Public Sub CreateNewSocket()
1708        _mySock = Nothing
1709        _mySock = New MySocket("UTF-8", Username, Password, _proxyType, _proxyAddress, _proxyPort, _proxyUser, _proxyPassword)
1710        _signed = False
1711    End Sub
1712
1713    Public Function GetReplyStatusID(ByVal id As Integer) As Integer
1714        Dim resStatus As String = ""
1715        Dim resMsg As String = DirectCast(_mySock.GetWebResponse("https://" + _hubServer + _ShowStatus + id.ToString() + ".xml", resStatus, MySocket.REQ_TYPE.ReqPOSTEncodeProtoVer2), String)
1716        Dim xdoc As Xml.XmlDocument = New Xml.XmlDocument()
1717        xdoc.LoadXml(resMsg)
1718        Try
1719            If xdoc.SelectSingleNode("/status/in_reply_to_status_id").InnerXml <> "" Then
1720                Return Integer.Parse(xdoc.SelectSingleNode("/status/in_reply_to_status_id").ChildNodes(0).Value)
1721            Else
1722                Return -1
1723            End If
1724        Catch ex As Xml.XmlException
1725            Return -2
1726        End Try
1727    End Function
1728
1729    Public Function MakeShortUrl(ByVal ConverterType As Integer, ByRef SrcUrl As String) As String
1730        Dim ret As String = ""
1731        Dim resStatus As String = ""
1732
1733        Select Case ConverterType
1734            Case UrlConverter.TinyUrl       'tinyurl
1735                If SrcUrl.StartsWith("http") Then
1736                    Try
1737                        ret = DirectCast(_mySock.GetWebResponse("http://tinyurl.com/api-create.php?url=" + SrcUrl, resStatus, MySocket.REQ_TYPE.ReqPOSTEncode), String)
1738                    Catch ex As Exception
1739                        Return "Can't convert"
1740                    End Try
1741                End If
1742                If Not ret.StartsWith("http://tinyurl.com/") Then
1743                    Return "Can't convert"
1744                End If
1745            Case UrlConverter.Isgd
1746                If SrcUrl.StartsWith("http") Then
1747                    Try
1748                        ret = DirectCast(_mySock.GetWebResponse("http://is.gd/api.php?longurl=" + SrcUrl, resStatus, MySocket.REQ_TYPE.ReqPOSTEncode), String)
1749                    Catch ex As Exception
1750                        Return "Can't convert"
1751                    End Try
1752                End If
1753                If Not ret.StartsWith("http://is.gd/") Then
1754                    Return "Can't convert"
1755                End If
1756        End Select
1757
1758        Return ret
1759    End Function
1760
1761    Public Function UrlConvert(ByVal Converter_Type As UrlConverter, ByRef ExcludeString As String) As Boolean
1762        Dim result As String = ""
1763        Dim url As Regex = New Regex("https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+")
1764        Dim urls As RegularExpressions.MatchCollection = Nothing
1765        Dim src As String = ""
1766
1767        urls = url.Matches(TweenMain.StatusText.Text)
1768
1769        ' 正規表現にマッチしたURL文字列をtinyurl化
1770        For Each tmp2 As Match In urls
1771            Dim tmp As String = tmp2.ToString
1772
1773            ' ExcludeStringで指定された文字列で始まる場合は対象としない
1774            If tmp.StartsWith(ExcludeString) Then
1775                ' Nothing
1776            Else
1777                '選んだURLを選択(?)
1778                TweenMain.StatusText.Select(TweenMain.StatusText.Text.IndexOf(tmp), tmp.Length)
1779
1780                'tinyurl変換
1781                result = MakeShortUrl(Converter_Type, TweenMain.StatusText.SelectedText)
1782
1783                If result.Equals("Can't convert") Then
1784                    Return False
1785                End If
1786
1787                If Not result = "" Then
1788                    TweenMain.StatusText.Select(TweenMain.StatusText.Text.IndexOf(tmp), tmp.Length)
1789                    TweenMain.StatusText.SelectedText = result
1790                End If
1791
1792            End If
1793        Next
1794
1795        Return True
1796
1797    End Function
1798
1799#If DEBUG Then
1800    Public Sub GenerateAnalyzeKey()
1801        '解析キー情報部分のソースをwedataから作成する
1802        '生成したソースはプロジェクトのディレクトリにコピーする
1803        Dim sw As New System.IO.StreamWriter(".\AnalyzeKey.vb", _
1804            False, _
1805            System.Text.Encoding.UTF8)
1806
1807        sw.WriteLine("Public Partial Class Twitter")
1808        sw.WriteLine("'    このファイルはデバッグビルドのTweenにより自動作成されました   作成日時  " + DateAndTime.Now.ToString())
1809        sw.WriteLine("")
1810
1811        sw.WriteLine("    Private _splitPost As String = " + Chr(34) + _splitPost.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1812        sw.WriteLine("    Private _splitPostRecent As String = " + Chr(34) + _splitPostRecent.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1813        sw.WriteLine("    Private _statusIdTo As String = " + Chr(34) + _statusIdTo.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1814        sw.WriteLine("    Private _splitDM As String = " + Chr(34) + _splitDM.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1815        sw.WriteLine("    Private _parseName As String = " + Chr(34) + _parseName.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1816        sw.WriteLine("    Private _parseNameTo As String = " + Chr(34) + _parseNameTo.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1817        sw.WriteLine("    Private _parseNick As String = " + Chr(34) + _parseNick.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1818        sw.WriteLine("    Private _parseNickTo As String = " + Chr(34) + _parseNickTo.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1819        sw.WriteLine("    Private  _parseImg As String = " + Chr(34) + _parseImg.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1820        sw.WriteLine("    Private _parseImgTo As String = " + Chr(34) + _parseImgTo.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1821        sw.WriteLine("    Private _parseMsg1 As String = " + Chr(34) + _parseMsg1.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1822        sw.WriteLine("    Private _parseMsg2 As String = " + Chr(34) + _parseMsg2.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1823        sw.WriteLine("    Private _parseDM1 As String = " + Chr(34) + _parseDM1.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1824        sw.WriteLine("    Private _parseDM2 As String = " + Chr(34) + _parseDM2.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1825        sw.WriteLine("    Private _parseDate As String = " + Chr(34) + _parseDate.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1826        sw.WriteLine("    Private _parseDateTo As String = " + Chr(34) + _parseDateTo.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1827        sw.WriteLine("    Private _getAuthKey As String = " + Chr(34) + _getAuthKey.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1828        sw.WriteLine("    Private _getAuthKeyTo As String = " + Chr(34) + _getAuthKeyTo.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1829        sw.WriteLine("    Private _parseStar As String = " + Chr(34) + _parseStar.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1830        sw.WriteLine("    Private _parseStarTo As String = " + Chr(34) + _parseStarTo.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1831        sw.WriteLine("    Private _parseStarEmpty As String = " + Chr(34) + _parseStarEmpty.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1832        sw.WriteLine("    Private _followerList As String = " + Chr(34) + _followerList.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1833        sw.WriteLine("    Private _followerMbr1 As String = " + Chr(34) + _followerMbr1.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1834        sw.WriteLine("    Private _followerMbr2 As String = " + Chr(34) + _followerMbr2.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1835        sw.WriteLine("    Private _followerMbr3 As String = " + Chr(34) + _followerMbr3.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1836        sw.WriteLine("    Private _getInfoTwitter As String = " + Chr(34) + _getInfoTwitter.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1837        sw.WriteLine("    Private _getInfoTwitterTo As String = " + Chr(34) + _getInfoTwitterTo.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1838        sw.WriteLine("    Private _isProtect As String = " + Chr(34) + _isProtect.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1839        sw.WriteLine("    Private _isReplyEng As String = " + Chr(34) + _isReplyEng.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1840        sw.WriteLine("    Private _isReplyJpn As String = " + Chr(34) + _isReplyJpn.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1841        sw.WriteLine("    Private _isReplyTo As String = " + Chr(34) + _isReplyTo.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1842        sw.WriteLine("    Private _parseProtectMsg1 As String = " + Chr(34) + _parseProtectMsg1.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1843        sw.WriteLine("    Private _parseProtectMsg2 As String = " + Chr(34) + _parseProtectMsg2.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1844        sw.WriteLine("    Private _parseDMcountFrom As String = " + Chr(34) + _parseDMcountFrom.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1845        sw.WriteLine("    Private _parseDMcountTo As String = " + Chr(34) + _parseDMcountTo.Replace(Chr(34), Chr(34) + Chr(34)) + Chr(34))
1846        sw.WriteLine("End Class")
1847
1848        sw.Close()
1849        MessageBox.Show("解析キー情報定義ファイル AnalyzeKey.vbを生成しました")
1850
1851    End Sub
1852#End If
1853End Class
Note: See TracBrowser for help on using the browser.