用javascript协助导入图片

需求

先说说需求。春节回家见爸妈,老爸迷上了摄影。他把平时的照片都上传到了 成都图片网, 这个成都图片网专门有一个 “快拍成都” 的版块,用于大家将随手拍的生活中的图片分享上去。每天编辑还会选出一张最有特色的图片,刊登到《成都商报》上。

快拍成都版块的网址是:http://photo.chengdu.cn/diary.php,另外,这个成都图片网还带有一个 “ 拍客论坛 “,论坛的网址是:http://photo.chengdu.cn/bbs/

老爸在兴奋地给我介绍完他的光辉成果之后 , 提出了他的需求:他希望在 “快拍成都” 发完图片后,能够自动将图片保存到他在 “ 拍客论坛 “ 上的 “个人相册” 中。

调研

简单研究了一个这个网站。明显这个网站自带的论坛是改的别人的开源系统,而 “快拍成都” 这个功能由于需求比较特别,能看出来是另外开发的另一套系统。这 2 套系统仅仅是将用户个人认证功能合在一起。并没有实现图片从 “快拍成都” 导入到 “论坛相册” 的功能。所以说,只能自己想办法实现了。要么全部手工弄一遍,要么写程序来做。

简单尝试了一下手工 copy,发现完全不可行,主要是图片介绍的文字是用 css 来排版到一起的,如果单纯复制文字出来,文字的顺序会乱掉。所以只能编程搞了。

我们需要用编程实现的技术步骤很简单:

  1. 模拟登陆到快拍成都。
  2. 从个人页面中点击 “我的作品”,查看自己的作品列表。
  3. 将自己的作品列表中的每一个作品中,包括的所有图片及相对应的介绍文字都下载下来。
  4. 模拟登陆到 “ 拍客论坛 “中。
  5. 对于每一个作品,在论坛的相册中建立一个对应的相册,然后将对应的图片上传上去,并且配上对应的文字。

技术方案

其实我最熟的语言是 Java,但是如果用 Java 来做这件事情的话,我需要:

  1. 了解登陆的 Form,模拟浏览器进行登陆过程,然后保存登陆成功后的 Cookie.
  2. 模拟各种网页请求,将对应的页面内容抓取过来。
  3. 解析 html 内容,用正则表达式匹配到图片的 url 和介绍文字的内容。然后把这些都保存下来。
  4. 了解拍客论坛这个 bbs 的相应 Form 的内容,模拟上传图片和介绍。

这些步骤比较麻烦,而且有些做得好的网站,为了防止模拟登陆,通常在登陆前会执行一段混淆的 javascript,把 Form 中的用户名和密码进行进一步的加工再 POST 到服务器上。考虑到这个网站是改的开源的 bbs,可能会有相应的功能。那这样的话我还需要看 js 的代码,了解它又做了哪些事,把对应的逻辑用 Java 实现了。

每种语言都有它擅长的地方,对于网页来说,最方便处理的当然是 Javascript 了。如果用 Javascript,上面的那些麻烦的步骤都可以省略掉了。于是最后,我写了 2 段 Javascript 来处理这个工作。

第一段 Javascript,取出相应的图片 url 和介绍文字,生成第二个 Javascript 代码

var ps = $('.lazyload');
var ts = $('h5');
for (var i = 0; i < ps.length; ++i) {
console.log($(ps[i]).attr('original'));
}
console.log($($('h2')[0]).text());
console.log(''); for (var i = 0; i < ps.length; ++i) {
console.log('document.getElementsByTagName("textarea")[' + i + '].value="\\');
console.log(" 图片属性:" + $(ts[i*2]).find('p').text() + '\\');
console.log(" 图片描述:" + $(ts[i*2+1]).find('p').text() + '";');
}

第二段 Javascript 由第一段 Js 生成,用于在论坛相册中将对应图片的介绍文字填上。

有了上面的那段 JS,我导照片的步骤如下:

  1. 打开 “快拍成都” 的页面,找到需要导出的照片专题。
  2. 执行我上面提到的那段 js,它会将需要下载的图片列出来,并且生成另一段 js.
  3. 手工下载上面列出来的图片到本地。
  4. 在论坛的个人相册中,把这些图片选择上传上去,然后执行生成的另一段 js,图片介绍就会自动填上了。

本来上传图片这一步也应该自动完成的,但是我无法解决浏览器对于 js 的限制:浏览器不允许 js 帮用户选择本地文件。所以这一步只能用手动来完成。

导图片的工作最终在 js 脚本的协助下,花了 1 个半小时完成了。不过心里还是有点不爽,听 zyc 说可以用 nodejs 和 jsdom 来在命令行中模拟浏览器相关的功能,所以打算试试把这个工作用 nodejs 和 jsdom 来完成。正在研究中,完成后再写一篇总结的博客。

用javascript协助导入图片的更多相关文章

  1. (转载)SQL中导入图片

    SQL中导入图片 分类: 论坛精贴 2006-05-10 12:07 398人阅读 评论(0) 收藏 举报 sqlimage服务器insertlogingo 1.建立过程CREATE PROCEDUR ...

  2. 有关ios中images.xcassets的导入图片等命名问题

    最近遇到一个问题,就是在设置启动图片的时候,把启动图片命名设置为了xxx@2x.png, 然后应用死活没有显示启动图片,调试了很久,才发现是因为文件命名的原因. 1. 如果在图片的下方有2x或3x的标 ...

  3. 每天一个JavaScript实例-推断图片是否载入完毕

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  4. JavaScript修改Canvas图片

    用JavaScript修改Canvas图片的分辨率(DPI)   应用场景: 仓库每次发货需要打印标签, Canvas根据从数据库读取的产品信息可以生成标签JPG, 但是这个JPG图片的默认分辨率(D ...

  5. javascript仿新浪微博图片放大缩小及旋转效果

    javascript仿新浪微博图片放大缩小及旋转效果 经常看到新浪微博里有图片放大缩小旋转效果,感觉效果还不错,所以就想试着做一个类似的demo出来,至于旋转对于IE可以用滤镜来解决,标准的浏览器可以 ...

  6. [转]iOS:批量导入图片和视频到模拟器的相册

    IOS开发中我们经常会用到模拟器调试,模拟器有个主要的好处就是程序启动块,最重要的是如果没有证书的话,我们就只能在模拟器上调试了.使用模拟器调试时我们可能碰到需要从系统相册选择图片的情况,特别是做图片 ...

  7. JavaScript实现判断图片是否加载完成的3种方法整理

    JavaScript实现判断图片是否加载完成的3种方法整理 有时候我们在前端开发工作中为了获取图片的信息,需要在图片加载完成后才可以正确的获取到图片的大小尺寸,并且执行相应的回调函数使图片产生某种显示 ...

  8. AutoCAD中导入图片

    导入图片涉及到两个关键的问题:如何将图片放置到指定的位置或范围内:如何修改图片的路径类型,如相对路径.绝对路径. 本文以AutoCAD 2018位演示截图来源. 1 将图片放置到指定的位置或范围内 ( ...

  9. 特殊例子--JavaScript代码实现图片循环滚动效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. 【分布式存储】GlusterFS failing to mount at boot with Ubuntu 14.04

    GlusterFS failing to mount at boot with Ubuntu 14.04   Previously I asked about mounting GlusterFS a ...

  2. (转)Sublime Text 2 2.0.2 序列号

    ----- BEGIN LICENSE -----Andrew WeberSingle User LicenseEA7E-855605813A03DD 5E4AD9E6 6C0EEB94 BC9979 ...

  3. python提取百万数据到csv文件

    转自:http://www.2cto.com/kf/201311/258112.html 今天有需求,需要把系统所有用户注册的id和邮箱等信息导出来提供给他们,在mysql里面count了下,大概有3 ...

  4. Java for LeetCode 025 Reverse Nodes in k-Group

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...

  5. ext上传文件到mysql上

    不废话,上代码: controller如下: /** * 上传附件 * @param request * @param baseBlob * @param response */ @RequestMa ...

  6. NEFU 1146 又见A+B

    又见a+b Problem:1146 Time Limit:1000ms Memory Limit:65535K Description 给定两个非负整数A,B,求他们的和. Input 多组输入,每 ...

  7. 【读书笔记】读《JavaScript模式》 - 函数复用模式之类式继承模式

    实现类式继承的目标是通过构造函数Child()获取来自于另外一个构造函数Parent()的属性,从而创建对象. 1.类式继承模式#1 —— 默认方式(原型指向父函数实例) function Paren ...

  8. C#控制管理VisualSVN Server

    VisualSVN Server可以用WMI接口管理(Windows Management Instrumentation). VisualSVN Server安装的计算机中,位于%VISUALSVN ...

  9. onSaveInstanceState和onRestoreInstanceState

    本文摘自: http://h529820165.iteye.com/blog/1399023 Android calls onSaveInstanceState() before the activi ...

  10. IntelliJ下使用Code/Live Template加快编码速度:程序员的工作不是写程序,而是写程序解决问题

    程序员的工作不是写程序,而是写程序解决问题. --- 某不知名程序员 我们每天都在写代码,有些代码有结构性的相似,但不是所有的代码都可以被抽成方法.在这种情况下,我们应该考虑使用template的方式 ...