2016-08-15 9 views
0

명령 줄에서 send-anywhere.com을 사용하기 위해 Crystal에서 CLI 도구를 빌드하려고했습니다.curl을 사용하여 여러 파일을 send-anywhere.com으로 보내지 못했습니다.

멀티 파트는 Crystal에 내장되어 있지 않지만 필자 자신의 글을 쓰기 전에는 cURL을 사용하여 얼마나 정확하게 만들어야하는지 생각했지만 필자는 그것을 cURL과 함께 사용할 수 없다고 생각했습니다!

두 개 이상의 파일을 cURL로 보낼 때 해당 서버는 수신되는 파일이 하나 뿐이며 전체 길이를 볼 수는 있지만 하나의 파일 만 기대하기 때문에 50 %에서 실패합니다.

나를 죽이는 것은 브라우저에서 작동한다는 것입니다. 네트워크 관리자가 열려 있고 내 cURL 요청과의 차이점을 보지 못했습니다. Expect 헤더를 100으로 계속 설정하려고 시도했지만 비교해 보았지만 브라우저에서 효과가 있고 말려 있지 않은 것은 무엇인지 알 수 없습니다.

가 여기에 내가 컬 같은 결과 모두와 함께 시도 명령이다, 서버는 테스트를 위해 나는 일반적인 라이센스 파일의 몇 사본을 사용하고 있지 2.

들어오는 단지 1 파일을보고 끝납니다.

curl -F [email protected] -F [email protected] https://...their.weblink... 

내가 파일 이름 = "[] 파일"내용 - 처리에, 그래서 (같은 결과) 그것을 자신을 시도 크롬이 이름을 관리자에서 본 적이 : 또한

curl -F file[][email protected] -F file[][email protected] https://...their.weblink... 

내가 동일한 결과를 가지고 -H "Expect: 100-continue"을 사용하여이 두 명령을 시도했습니다.

이 시점에서 나는 미쳤어. 나는 그것을 나 자신으로 시도 할 것이라고 생각했다. 아마 cURL은 제대로 할 수 없을 것이다. (매우 가능성은 낮다. https://github.com/hangyas/TelegramBot/blob/b3fcbbb621bd669bbafe9f3e91364702d06d1e10/src/TelegramBot/http_client_multipart.cr

그것은 꽤 간단합니다하지만 난 여전히 같은 문제를 얻을 :

그래서 처음부터 쓰기 전에 나는 봇 여기에서 볼 전보에 의해 사용되었다 구현을 시도했다. 첫 번째 파일 만 인식됩니다.

참고 : 하나의 파일 만 전송할 때 cURL과 Crystal 구현 모두에 문제가 없습니다.

저는 미쳐 가고 있습니다. 작동하는 브라우저와 다른 브라우저의 차이점은 무엇입니까? 나는 무엇을 보지 못하니?

나는 구현을 찾고있는 것이 아니라, 내가 놓친 것을 지적하기 위해 여러 파일을 올바르게 인식하게 할 수 있습니까?

+0

mutlipart는 표준 라이브러리에 곧 포함되어야합니다 (https : // github 참조).com/crystal-lang/crystal/pull/2967 –

+0

@ JonneHaß 그래, 나는 잠시 동안 그 문제를 따라 왔다는 것을 알고있다! 그러나 나는 그것이 내가 가지고있는이 문제를 고칠 것이라고 확신하지 못한다. – ItsASecret

+0

나는이 사이트를 얻지 못한다. 나는 파일을 추가 할 때 아무 것도하지 않는다. (나는 올바른 사이트를 시도했고 도메인에서 대시를 잊었다 고 가정한다.) –

답변

2

이것은 교육적인 목적으로 만 사용되며 실제 위법 행위는 에 위배됩니다. API 키가 제공된 후에 대신 을 사용해야하는 문서화 된 API가 있습니다.

key 끝점에 파일 수를 올바르게 알려주는 것이 중요합니다. 따라서 전체 흐름은 다음과 같습니다.

#!/bin/bash 

# First we need to get a device key by registering ourselves as a 
# device. For that we need a profile name. We need to store the 
# received cookie and send it with the subsequent request. 
profilename="$(openssl rand -hex 6)" 
curl -c .session -vL https://send-anywhere.com/web/device \ 
    -d "os_type=web" \ 
    -d "profile_name=$profilename" \ 
    -d "manufacturer=Linux" \ 
    -d "model_number=Firefox" \ 
    -d "app_version=48" \ 
    -d "device_language=en-US" 

# We need to know the individual filesizes in bytes as well as 
# the total size we're going to upload 
file0name="foo.txt" 
file0size="$(wc -c "$file0name" | cut -d ' ' -f 1)" 
file1name="bar.txt" 
file1size="$(wc -c "$file1name" | cut -d ' ' -f 1)" 
filesize="$(echo "$file0size + $file1size" | bc)" 

# Using that info and the cookie we got from the device key 
# we can correctly announce our upload 
key="$(curl -b .session -vL https://send-anywhere.com/web/key \ 
    -d "file[0][name]=$file0name" -d "file[0][size]=$file0size" \ 
    -d "file[1][name]=$file1name" -d "file[1][size]=$file1size" \ 
    -d "file_number=2" -d "file_size=$filesize")" 

# We get some JSON back with the URL to send to the receiver 
# and the URL to upload back 
url="$(echo "$key" | ruby -rjson -e 'print JSON.parse($stdin.read)["link"]')" 
upload_url="$(echo "$key" | ruby -rjson -e 'print JSON.parse($stdin.read)["weblink"]')" 

echo 
echo "------------------------------------------------------------" 
echo "Receive 2 files of $filesize bytes at $url" 
echo "------------------------------------------------------------" 
echo 

# And finally do the upload 
curl -vL "$upload_url" \ 
    -F "file[][email protected]$file0name" \ 
    -F "file[][email protected]$file1name" 
+0

아아! 이전 요청이 제대로 작동하고 있기 때문에 결코 생각하지 못했습니다. 그렇습니다. 내 API 키가 있습니다. 또한 완전히 이해하지 못했지만 API를 사용하여 여러 파일을 보내는 것이 ToS와는 다릅니다 (유효한 키 포함)? 아니면 단순히 API 키를 사용하지 않고 파일을 보내시겠습니까? 어쨌든 고마워, ! – ItsASecret

+0

어쩌면 그들은 단지 자신의 API 문서에 이것을 추가하는 것을 잊어 버렸을 것입니다. doc : https://send-anywhere.com/web/page/api#web-gui 파일 개수를 지정하지 않아도됩니다! – ItsASecret

+0

어쩌면 그것은 분명하지 않았지만 처음부터 내 API 키를 사용하고있었습니다. 그러나 열쇠는 마지막 단계 (웹 링크로 업로드)에 필요하지 않습니다. 그래서 그것에 대한 언급이 없었습니다. register_device 및 get_6_digits_key 단계를 수행하기 만하면됩니다. – ItsASecret