| | 1043 | Private Function doShortUrlResolve(ByRef orgData As String) As Boolean |
| | 1044 | Dim replaced As Boolean = False |
| | 1045 | For Each _svc As String In _ShortUrlService |
| | 1046 | Dim svc As String = _svc |
| | 1047 | Dim posl1 As Integer |
| | 1048 | Dim posl2 As Integer = 0 |
| | 1049 | |
| | 1050 | Do While True |
| | 1051 | If orgData.IndexOf("<a href=""" + svc, posl2, StringComparison.Ordinal) > -1 Then |
| | 1052 | Dim urlStr As String = "" |
| | 1053 | Try |
| | 1054 | posl1 = orgData.IndexOf("<a href=""" + svc, posl2, StringComparison.Ordinal) |
| | 1055 | posl1 = orgData.IndexOf(svc, posl1, StringComparison.Ordinal) |
| | 1056 | posl2 = orgData.IndexOf("""", posl1, StringComparison.Ordinal) |
| | 1057 | urlStr = orgData.Substring(posl1, posl2 - posl1) |
| | 1058 | Dim Response As String = "" |
| | 1059 | Dim retUrlStr As String = "" |
| | 1060 | Dim tmpurlStr As String = urlStr |
| | 1061 | Dim SchemeAndDomain As Regex = New Regex("http://.+?/+?") |
| | 1062 | Dim tmpSchemeAndDomain As String = "" |
| | 1063 | For i As Integer = 0 To 4 'とりあえず5回試す |
| | 1064 | retUrlStr = urlEncodeMultibyteChar(DirectCast(CreateSocket.GetWebResponse(tmpurlStr, Response, MySocket.REQ_TYPE.ReqGETForwardTo), String)) |
| | 1065 | If retUrlStr.Length > 0 Then |
| | 1066 | ' 転送先URLが返された (まだ転送されるかもしれないので返値を引数にしてもう一度) |
| | 1067 | ' 取得試行回数オーバーの場合は取得結果を転送先とする |
| | 1068 | Dim scd As Match = SchemeAndDomain.Match(retUrlStr) |
| | 1069 | If scd.Success AndAlso scd.Value <> svc Then |
| | 1070 | svc = scd.Value() |
| | 1071 | End If |
| | 1072 | tmpurlStr = retUrlStr |
| | 1073 | Continue For |
| | 1074 | Else |
| | 1075 | ' 転送先URLが返されなかった |
| | 1076 | If tmpurlStr <> urlStr Then |
| | 1077 | '少なくとも一度以上転送されている (前回の結果を転送先とする) |
| | 1078 | retUrlStr = tmpurlStr |
| | 1079 | Else |
| | 1080 | ' 一度も転送されていない |
| | 1081 | retUrlStr = "" |
| | 1082 | End If |
| | 1083 | Exit For |
| | 1084 | End If |
| | 1085 | Next |
| | 1086 | If retUrlStr.Length > 0 Then |
| | 1087 | If Not retUrlStr.StartsWith("http") Then |
| | 1088 | If retUrlStr.StartsWith("/") Then |
| | 1089 | retUrlStr = urlEncodeMultibyteChar(svc + retUrlStr.Substring(1)) |
| | 1090 | ElseIf retUrlStr.StartsWith("data:") Then |
| | 1091 | ' |
| | 1092 | Else |
| | 1093 | retUrlStr = urlEncodeMultibyteChar(retUrlStr.Insert(0, svc)) |
| | 1094 | End If |
| | 1095 | Else |
| | 1096 | retUrlStr = urlEncodeMultibyteChar(retUrlStr) |
| | 1097 | End If |
| | 1098 | orgData = orgData.Replace("<a href=""" + urlStr, "<a href=""" + retUrlStr) |
| | 1099 | posl2 = 0 '置換した場合は頭から再探索(複数同時置換での例外対応) |
| | 1100 | replaced = True |
| | 1101 | End If |
| | 1102 | Catch ex As Exception |
| | 1103 | '_signed = False |
| | 1104 | 'Return "GetTimeline -> Err: Can't get tinyurl." |
| | 1105 | End Try |
| | 1106 | Else |
| | 1107 | Exit Do |
| | 1108 | End If |
| | 1109 | Loop |
| | 1110 | Next |
| | 1111 | Return replaced |
| | 1112 | End Function |
| | 1113 | |
| | 1114 | |
| 1045 | | For Each svc As String In _ShortUrlService |
| 1046 | | Dim posl1 As Integer |
| 1047 | | Dim posl2 As Integer = 0 |
| 1048 | | |
| 1049 | | Do While True |
| 1050 | | If orgData.IndexOf("<a href=""" + svc, posl2, StringComparison.Ordinal) > -1 Then |
| 1051 | | Dim urlStr As String = "" |
| 1052 | | Try |
| 1053 | | posl1 = orgData.IndexOf("<a href=""" + svc, posl2, StringComparison.Ordinal) |
| 1054 | | posl1 = orgData.IndexOf(svc, posl1, StringComparison.Ordinal) |
| 1055 | | posl2 = orgData.IndexOf("""", posl1, StringComparison.Ordinal) |
| 1056 | | urlStr = orgData.Substring(posl1, posl2 - posl1) |
| 1057 | | Dim Response As String = "" |
| 1058 | | Dim retUrlStr As String = "" |
| 1059 | | Dim tmpurlStr As String = urlStr |
| 1060 | | Dim SchemeAndDomain As Regex = New Regex("http://.+?/+?") |
| 1061 | | Dim tmpSchemeAndDomain As String = "" |
| 1062 | | For i As Integer = 0 To 4 'とりあえず5回試す |
| 1063 | | retUrlStr = urlEncodeMultibyteChar(DirectCast(CreateSocket.GetWebResponse(tmpurlStr, Response, MySocket.REQ_TYPE.ReqGETForwardTo), String)) |
| 1064 | | If retUrlStr.Length > 0 Then |
| 1065 | | ' 転送先URLが返された (まだ転送されるかもしれないので返値を引数にしてもう一度) |
| 1066 | | ' 取得試行回数オーバーの場合は取得結果を転送先とする |
| 1067 | | Dim scd As Match = SchemeAndDomain.Match(retUrlStr) |
| 1068 | | If scd.Success AndAlso scd.Value <> svc Then |
| 1069 | | svc = scd.Value() |
| 1070 | | End If |
| 1071 | | tmpurlStr = retUrlStr |
| 1072 | | Continue For |
| 1073 | | Else |
| 1074 | | ' 転送先URLが返されなかった |
| 1075 | | If tmpurlStr <> urlStr Then |
| 1076 | | '少なくとも一度以上転送されている (前回の結果を転送先とする) |
| 1077 | | retUrlStr = tmpurlStr |
| 1078 | | Else |
| 1079 | | ' 一度も転送されていない |
| 1080 | | retUrlStr = "" |
| 1081 | | End If |
| 1082 | | Exit For |
| 1083 | | End If |
| 1084 | | Next |
| 1085 | | If retUrlStr.Length > 0 Then |
| 1086 | | If Not retUrlStr.StartsWith("http") Then |
| 1087 | | If retUrlStr.StartsWith("/") Then |
| 1088 | | retUrlStr = urlEncodeMultibyteChar(svc + retUrlStr.Substring(1)) |
| 1089 | | ElseIf retUrlStr.StartsWith("data:") Then |
| 1090 | | ' |
| 1091 | | Else |
| 1092 | | retUrlStr = urlEncodeMultibyteChar(retUrlStr.Insert(0, svc)) |
| 1093 | | End If |
| 1094 | | Else |
| 1095 | | retUrlStr = urlEncodeMultibyteChar(retUrlStr) |
| 1096 | | End If |
| 1097 | | orgData = orgData.Replace("<a href=""" + urlStr, "<a href=""" + retUrlStr) |
| 1098 | | posl2 = 0 '置換した場合は頭から再探索(複数同時置換での例外対応) |
| 1099 | | End If |
| 1100 | | Catch ex As Exception |
| 1101 | | '_signed = False |
| 1102 | | 'Return "GetTimeline -> Err: Can't get tinyurl." |
| 1103 | | End Try |
| 1104 | | Else |
| 1105 | | Exit Do |
| 1106 | | End If |
| 1107 | | Loop |
| 1108 | | Next |
| | 1117 | Do |
| | 1118 | |
| | 1119 | Loop While doShortUrlResolve(orgData) |