ดาวน์โหลด Code Image Image


20

คำเตือน: คำตอบอาจเป็นประโยชน์กับนักกอล์ฟบางคน

ในความท้าทายในจำนวนมากโพสต์มีรูปภาพซึ่งจะต้องบันทึกเป็นไฟล์เพื่อให้สามารถทำงานกับปัญหาได้ นี่เป็นงานที่ต้องทำด้วยมือโดยเฉพาะอย่างยิ่งน่าเบื่อ โปรแกรมเมอร์เราไม่ควรต้องอยู่ภายใต้ความน่าเบื่อหน่าย งานของคุณคือการดาวน์โหลดภาพทั้งหมดที่มีอยู่ในคำถามรหัส Golf.SE โดยอัตโนมัติ

กฎระเบียบ

  • โปรแกรมของคุณอาจเชื่อมต่อกับส่วนใด ๆ ของstackexchange.comแต่ไม่สามารถเชื่อมต่อกับโดเมนอื่น ๆ ยกเว้นที่ตั้งของภาพ (กล่าวคือไม่ต้องกังวลกับตัวย่อ URL)
  • จำนวนเต็มNถูกกำหนดเป็นอินพุตบนบรรทัดรับคำสั่งหรือ stdin
  • URL รับประกันว่าจะเป็นลิงก์ที่ถูกต้องสำหรับคำถามของ Golf Golfhttp://codegolf.stackexchange.com/questions/N
  • รูปภาพแต่ละรูปที่แสดงในเนื้อความของคำถามNจะต้องบันทึกเป็นไฟล์ในเครื่องคอมพิวเตอร์ ยอมรับตำแหน่งใดตำแหน่งหนึ่งต่อไปนี้:
    • ไดเรกทอรีปัจจุบัน
    • ไดเร็กทอรีอินพุตโดยผู้ใช้
  • โปรแกรมของคุณจะต้องไม่บันทึกไฟล์อื่นนอกเหนือจากภาพในส่วนของคำถาม (เช่นรูปประจำตัวผู้ใช้หรือภาพที่มีคำตอบ)
  • รูปภาพจะต้องบันทึกด้วยนามสกุลไฟล์เดียวกับต้นฉบับ

นี่คือ - เขียนโปรแกรมที่สั้นที่สุดที่คุณสามารถทำได้

เกณฑ์ความถูกต้องสำหรับคำตอบ

มีกรณีที่เป็นไปได้หลายกรณีที่มีหลายภาพในชื่อเดียวกันข้อความที่มีชื่อเดียวกันกับองค์ประกอบ HTML เป็นต้นคำตอบจะไม่ถูกต้องเฉพาะเมื่อสามารถแสดงให้เห็นว่าล้มเหลวในการแก้ไขคำถามที่โพสต์ก่อนวันที่ 10 มกราคม 2015 .


ชื่อภาพควรจะเหมือนเดิมหรือเราสามารถทำเช่น 0.png, 1.png เป็นต้น
stokastic

@stokastic คุณสามารถตั้งชื่อส่วนก่อนที่จะขยายไปยังสิ่งที่คุณต้องการ (ตราบใดที่คุณไม่ใช้ชื่อเดียวกันสองครั้งเขียนทับไฟล์ก่อนหน้า)
feersum

คำตอบ:


10

Mathematica, 211 210 ไบต์

i=Import;FileNameTake@#~Export~i@#&/@ImportString["body"/.("items"/.i["http://api.stackexchange.com/2.2/questions/"<>InputString[]<>"?site=codegolf&filter=!*Lgp.gEWHA6BNP.l","JSON"])[[1]],{"HTML","ImageLinks"}]

Ungolfed:

i = Import;
FileNameTake@#~Export~i@# & /@ 
 ImportString[
  "body" /. (
    "items" /. 
      i["http://api.stackexchange.com/2.2/questions/" <> 
        InputString[] <> "?site=codegolf&filter=!*Lgp.gEWHA6BNP.l", 
       "JSON"]
  )[[1]], 
  {"HTML", "ImageLinks"}
 ]

มันค่อนข้างตรงไปตรงมา ฉันตั้งค่าตัวกรองสำหรับ StackExchange API ซึ่งจะส่งกลับเฉพาะเนื้อหาของคำถาม รหัสจะดึงข้อมูลคำถามด้วยตัวกรองนั้นและแยกวิเคราะห์เป็น JSON ฉันเลือกองค์ประกอบที่ถูกต้อง (เนื้อหา) และใช้ImportStringในการแยกวิเคราะห์ HTML และกรอง URL รูปภาพทั้งหมด FileNameTake@#~Export~Import@#จากนั้นดาวน์โหลดรูปภาพแต่ละรูปและเก็บไว้ในไดเรกทอรีการทำงานปัจจุบันที่มีชื่อไฟล์เดียวกับที่อยู่ใน URL

Directory[]คุณสามารถหาไดเรกทอรีการทำงานปัจจุบันด้วย

โดยหลักการแล้วมีเวอร์ชันที่สั้นกว่ามากเพราะImportStringสามารถดาวน์โหลดไฟล์ทั้งหมดได้ทันทีแทนที่จะส่ง URL ให้ฉัน แต่ฉันจะสูญเสียข้อมูลเกี่ยวกับประเภทไฟล์ต้นฉบับ (เนื่องจากพวกเขาถูกแปลงเป็นImageวัตถุเมื่อดาวน์โหลด) ดังนั้นฉันจึงสามารถบันทึกได้ทั้งหมดเป็นประเภทเดียวกัน (PNG, พูด)


8

Javascript - 149 161 ไบต์

$.get("http://codegolf.stackexchange.com/q/"+prompt(),function(e){$(".post-text:first img",e).each(function(e,t){$('<a href="'+t.src+'"download>')[0].click()})})

ด้วยช่องว่าง

$.get('http://codegolf.stackexchange.com/q/' + prompt(), function(d) {
  $('.post-text:first img',d).each(function(i,e){
   $('<a href="' + e.src + '"download>')[0].click();
  })
})

สคริปต์ต้องถูกเรียกใช้จากไซต์ stackexchange เพื่อทำงาน จะใช้ค่าเริ่มต้นเป็นหน้าปัจจุบันหากไม่มีการระบุหมายเลขคำถามไว้ในพรอมต์


1
ตามที่ @doorknob ที่กล่าวถึงข้างต้นคุณสามารถบันทึกได้นิดหน่อยโดยการแลกเปลี่ยนคำถาม และถ้าคุณไม่คิดที่จะรับภาพทั้งหมดในโพสต์บนหน้าคุณสามารถ$('[src*="imgur"]',d)เชื่อได้ ฉันชอบที่นี่สามารถทำงานในคอนโซล - ความพึงพอใจทันที
Josiah

1
questionsสามารถย่อให้สั้นลงได้qแต่ควรรวมถึงcodegolf.stackexchange.comส่วนแทนที่จะไว้ที่หน้านั้น @Josiah เป็นไปได้ที่จะรวมภาพจากโดเมนอื่น ๆ ในโพสต์
feersum

1
ตัวเลือก#question .post-text imgที่สามารถลงไปหรือ.post-text:first img .post-text:eq(0) img
cPu1

5

Python 2 - 241 ไบต์

ตรงไปตรงมาสวยอาจจะสามารถเล่นกอล์ฟต่อไป ฉันค้นหาไซต์เพื่อค้นหาสิ่งที่เกิดขึ้นทั้งหมดimg src=ระหว่างสิ่งที่เกิดขึ้นครั้งแรกpost-textและ/divต่อจากนั้นทันที แต่ละ URL ภาพจะถูกอ่านและบันทึกลงในไดเรกทอรีทำงาน

import string,sys,urllib,re;o=string.find;u=urllib.urlopen
r=u("http://codegolf.stackexchange.com/q/"+sys.argv[1]).read()
i=o(r,"post-text")
for p in re.findall(r'img src="([^"]*)',r[i:o(r,"/div",i)]):f=open(p[-9:],"wb");f.write(u(p).read())

ชื่อไฟล์จะถูกเก็บไว้ตามที่เป็น - ชื่อถูกนำมาเป็น 9 ไบต์สุดท้าย ( [-9:]) ของ URL ภาพซึ่งควรเก็บชื่อตัวละครของ 5 และ a .pngหรือ.jpgอื่น ๆ มันจะตัดไบต์ของชื่อไฟล์ถ้านามสกุลมีความยาวมากกว่า 3 ตัว .
Stokastic

เกิดอะไรขึ้นถ้าชื่อไฟล์สั้นกว่า 9 ไบต์? จะไม่รวมเครื่องหมายทับในชื่อไฟล์หรือไม่?
Martin Ender

คุณสามารถบันทึก 2 ไบต์โดยการforวนซ้ำหนึ่งบรรทัด for p re.findall(...):f=open(...);f.write(...)
undergroundmonorail

@mar ฉันไม่คิดว่าชื่อไฟล์จะน้อยกว่า 9 ไบต์ แต่ฉันอาจถูกเข้าใจผิด
undergroundmonorail

@ MartinBüttnerฉันคิดว่า 9 ไบต์เป็นข้อสมมติที่สมเหตุสมผล แต่ฉันสามารถเปลี่ยนได้ถ้าคุณคิดว่าฉันควร สำหรับสิ่งที่คุ้มค่าการใช้เพียง 6 หรือ 7 ไบต์อาจเพียงพอและยังคงรับประกันชื่อไฟล์ที่แตกต่าง
Stokastic

2

Mathematica, 195

x=XMLElement;c=Cases;i=Import;l=Infinity;FileNameTake@#~Export~i@#&/@(((c[#,x["img",{"src"->e_,_},___]:>e,l]&)@*(c[#,x[_,{__,"id"->"question",__},e_]:>e,l]&)@*(i[#,"XMLObject"] &))@InputString[])

การส่งออกภาพในลักษณะเดียวกับที่มาร์ตินทำในโซลูชัน Mathematica ของเขาอ่านคำตอบของเขาสำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนั้น วิธีนี้แตกต่างจากของเขาแทนที่จะแยกวิเคราะห์ผลลัพธ์จาก API ฉันแยกวิเคราะห์หน้า HTML โดยตรง หรือค่อนข้างฉันแยกวิเคราะห์ XML สัญลักษณ์ที่ Mathematica สามารถสร้างจาก HTML


1

Python 2 - 398 342 334 ไบต์

โปรแกรมดาวน์โหลดหน้า SE แยกส่วนโพสต์ (องค์ประกอบ div ข้อความข้อความ) ค้นหา URL ที่สิ้นสุดในส่วนขยายภาพและดาวน์โหลดพวกเขา ภาพจะถูกบันทึกเช่นเดียวกับimg<n>.<ext>ในไดเรกทอรีปัจจุบัน

import urllib2 as u,re,sys
z=u.urlopen;i=1
p=z('http://codegolf.stackexchange.com/q/'+sys.argv[1]).read()
s=re.search(r'ss="po(.+?)/di',p,16).group(1)
for L in re.findall('"(h.+?://.*?)"',s):
 b=L.rsplit('.',1)
 if len(b)==2 and b[1].lower() in 'jpg jpeg png gif bmp'.split():
  open('img%u.%s'%(i,b[1]),'wb').write(z(L).read());i+=1

โปรแกรมนี้จะดาวน์โหลดรูปภาพที่ให้มาเป็นลิงค์ไม่เพียง แต่รูปภาพที่ฝังไว้ ด้วยการตั้งชื่อไฟล์ที่ไม่ซ้ำกันให้กับแต่ละภาพจะเป็นการหลีกเลี่ยงการปะทะกันของชื่อ


2
คุณสามารถบันทึกได้ 8 ตัวอักษรโดยแทนที่questionsด้วยq(ใน URL)
Doorknob

ในคำถาม 43274 ฉันเห็นเพียง 11 ภาพ แต่มีการดาวน์โหลด 21 ภาพ
feersum

โปรแกรมของฉันดาวน์โหลดภาพความละเอียดสูง 10 ภาพรวมถึงภาพขนาดย่อ 10 ภาพ ฉันไม่แน่ใจว่ารายการอื่น ๆ ดึงข้อมูลเวอร์ชันความละเอียดสูง
Logic Knight

@Doorknob - ขอบคุณ ฉันคิดถึงสิ่งนั้น ฉันจะต้องการอะไรมากกว่านี้เพื่อจับคนอื่น
Logic Knight

1
@CarpetPython แม้ว่ามันจะมีประโยชน์มากกว่า ... ความตั้งใจของสเป็คคือการดาวน์โหลดเฉพาะภาพที่มองเห็นได้
feersum

1

Bash - 86 ไบต์

wget -r -l1 -np -Ajpg,jpeg,png,bmp,gif http://codegolf.stackexchange.com/questions/$1

ไม่มีอะไรที่จะไม่แก้ไข -npป้องกัน wget จากการป้อนไดเรกทอรีด้านบน (User Imgs) -Aคว้าไฟล์ที่มีนามสกุลตรงกับรายการที่นำเสนอ -rเป็นการดาวน์โหลดแบบเรียกซ้ำ -lป้องกัน wget จากไปลึกเกินไป $1เป็นคำถามที่จะคว้า


1
มีบางสิ่งที่ฉันต้องทำเพื่อให้ทำงานได้หรือไม่ ฉันลองคำถามสองสามข้อ แต่ไม่ดี เอาท์พุทที่นี่
Geobits

1
ฉันคิดว่าคุณสามารถบันทึกได้ 8 ตัวอักษรโดยแทนที่questionsด้วยqใน URL
Timtech

1

Node.js, 251 247 ไบต์

r=require,g=r('request'),g('http://codegolf.stackexchange.com/q/'+process.argv[2],function(_,_,b){r('cheerio').load(b)('#question .post-text img').each(function(i,a){s=a.attribs.src,g(s).pipe(r('fs').createWriteStream(i+r('path').basename(s)))})})

ใช้requestเพื่อสร้าง HTTP GETและcheerioแยกวิเคราะห์ HTML การชนกันของชื่อได้รับการแก้ไขโดยการจัดทำดัชนีของภาพปัจจุบันไปยังชื่อฐานของ URL ของไฟล์ รูปภาพจะถูกบันทึกไปยังไดเรกทอรีเดียวกันกับไฟล์ปัจจุบัน


1

Lua ขนาด 200 ไบต์

r=require'socket.http'.request r('http://codegolf.stackexchange.com/questions/'.. ...):gsub('post.text(.-)div',function(p)p:gsub('src="(.-)"',function(i)io.open(i:sub(-9),'wb'):write((r(i)))end)end)

ยอมรับตัวเลขเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

ถือว่าทุกsrc=แอตทริบิวต์จะใช้กับimgแท็กเนื่องจากแท็กเหล่านี้เป็นแท็กเดียวที่มีsrcแอตทริบิวต์ที่อนุญาตให้มีการแลกเปลี่ยนสแต็ก (ใช่ไหม)

.. ...นอกจากนี้ยังทราบ ฉันภูมิใจเป็นพิเศษ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.